T1. 일치
KMP는 것을 살펴이지만, 잊어 버렸습니다.
아, 템플릿 그것의 뒷면에!
아? ! 폭력 72 점? ! ? ! ? ! 해!
일반적으로 KMP의 솔루션은 다음 get_next 캐릭터와 (B)의 연결 (및 약간 혼잡 사이), 양성이고;
더 이상 없습니다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #INCLUDE <. 비트 / stdc ++ H> 2 #DEFINE가 긴 긴 버리는 3 #DEFINE의 RE 레지스터 4 이용한 스페이스 성병; 5 인라인 INT의 R () { 6 RE의 숯 C = getchar가 (); INT X = 0 , t는 = 1 ; 7 일 동안 (c < ' 0 ' || C> ' 9 ' ) { 경우 (c == ' - ' ) t = - 1 ; C = getchar가 ();} 8 하면서 (c> =' 0 ' && C <= ' 9 ' ) {(X) = (X << 3 ) + (X << 1 ) + C - ' 0 ' , C = getchar가 ();} 9 복귀 의 X *의 t; 10 } 11 CONST의 INT의 maxn = 5,000,010 ; 12 INT LA, LB, LC; 13 문자 A [maxn], B [maxn], C [maxn, D; 14 INT의 NXT [maxn]; (15) 보이드 get_nxt () { 16 INT를 p = 0 ; NXT [ 1 ] = 0 ; (17) 에 대한이 ( int로 I = 2 ; I <= (LC); 나는 ++ ) { 18 반면 (p & & C [P + 1 ] = (C)의 [I]!) p = NXT [P]; 19 일 경우 (c를 [피 + 1 ] == C [I])를 P ++ ; 20 NXT [내가] = P; 21 } 22 } 23 INT 의 main () { 24 // freopen을 ( "in1.txt", "R", 표준 입력); 25 의 INT t; 26 T = R (); 27 일 동안 (t-- ) { 28 라 R = (), LB = R (); (29) scanf와 ( " %의 S " , A + 1 ); 30 CIN >> D; (31) 에 대한이 ( int로 I = 1 ; I <= (LB); 나는 ++ ) 32 개 (B)는 [I] = A [I]; 33 B [++ LB = D; (34) 에 대한이 ( int로 I = 1 ; i가 라 = <; 내가 ++) [I] = C A [I]; 35 LC = 라; 36 개 C [++ LC = ' ~ ' ; 37 개 C [++ LC = ' ! ' ; (38) 위한 ( int로 난 = 1 ; I <= (LB); 나는 ++)의 C = [내가 LC +] B가 [I]; 39 LC + = LB; 40 get_nxt (); 41 의 printf ( " % D \ 없음 " , NXT [LC]); 42 } 43 반환 0 ; 44 }