まず貪欲、$ S $缶と$ T $の試合に一致するように試してみてください、ただの$ P $の残りの部分は記入してみましょう
に十分な文字がある場合、$ S $の試合の場合はすべて、$ P $を見てみましょう
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1。CH =getchar関数(); } 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 233 。 INT Q、N、M、K、CNT [N]、CNTT [N]。 チャーS [N]、T [N]、P [N]。 BOOL VIS [N]。 INT メイン() { Q = リード()。 一方、(Q-- ) { scanf関数(" %sの"、S + 1)。scanf関数(" %sの"、T + 1)。scanf関数(" %sの"、P + 1 )。 INT、N = STRLEN(S + 1)、m個の=のSTRLEN(T + 1)、Kの=のSTRLEN(P + 1 )。 もし(N> M){のprintf(" NOの\ n "); 続け; } のmemset(VIS、0、はsizeof (VIS))。 以下のために(int型 i = 0 ; iは< 30 ; I ++)CNTを[I] = CNTT [I] = 0 ; ために(int型 i = 1 ; iが= Kを<; I ++)は、CNT [P [I] - [ A ' ] ++ ; INTは L = 0、P = 1 。 以下のために(int型 I = 1 ; I <= M iは++ ) { もし(T [I] = S [P]を!)続けます。 VIS [I] = 1。P ++; もし(P> N)、ブレーク。 } もし(p <= N){のprintf(" NOの\ n "); 続け; } BOOL GG = 0; 用(int型 iは= 1 ; I <= M Iは++ ) 場合(!VIS [I]) { CNTT [T [I] - [ A ' ] ++ ; もし(CNTT [T [I] - [ A ' ]> CNT [T [I] - [ A ' ])GG = 1 。 } であれば(GG)のprintf(" NOの\ n " ); 他のprintf(" YES \ nを" ); } 戻り 0; }