連結した文字列は、変位の問題を解決することができます。
コードは以下の通りであります:
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3符号なしのtypedef int型のUI。 4のtypedef 長い 長LL。 5符号なしのtypedef 長い 長いULL。 6 の#define PFのprintf 7 の#define MEM(A、B)のmemset(A、B、はsizeof()) 8 の#define prime1 1E9 + 7 9 の#define prime2 1E9 + 9 10 の#define PI 3.14159265 11 の#define LSON Lを、半ば、室温<< 1 12 の#define rson半ば+ 1、R、RT << 1 | 1 13 の#define scand(X)のscanf( "%のLLF"、&x)は 14 の#define F(I、B)のための(INT iは=; I <= B; I ++) 15 の#defineスキャン()のscanf( "%のD"、&A) 16 の#define DBG(引数)COUT <<#引数<< ":" <<引数<< ENDL。 17 の#define INF 0x3f3f3f3f 18 の#define MAXN 1000010 19 整数N、M、T。 20 チャーS [MAXN]、P [MAXN]、NXT [MAXN]。 21 ボイドgetnxt() 22 { 23 NXT [ 0 ] = - 1 。 24 int型私は= - 1、25 一方(J < strlenを(P)) 26 { 27 であれば(I == - 1つの || P [I] == P [J]) 28 { 29 I ++、J ++ 。 30 もし(P [I] == P [J])NXT [J] = NXT [I]。 31 他の NXT [J] = I; 32 } 33 他 I = NXT [I]。 34 } 35 } 36 空隙KMP() 37 { 38 INT PLEN = STRLEN(P)。 39 int型 SLEN =STRLEN(S); 40 int型私は= 0、J = 0 ; 41 一方(I < SLEN) 42 { 43 であれば(J == - 1 || S [I] == P [J])は、i ++、J ++ 。 44 他 J = NXT [J]。 45 であれば(J == PLEN) 46 { 47 PF(" はい\ n " ); 48 リターン; 49 } 50 } 51 PF(" なし\ n " ); 52 } 53 のint main()の 54 { 55 // freopenは( "INPUT.TXT"、 "R"、標準入力)。 56 // freopenは( "output.txtと"、 "W"、STDOUT)。 57件 のstd ::イオス:: sync_with_stdio(偽); 58 一方(scanf関数(" %S%S "、S、P)== 2 ) 59 { 60 であれば(strlenを(S)<STRLEN(P))、PF(" なし\ n " ); 61 他{ 62 INT LEN = STRLEN(S)。 63 F(I、0、len-1)S = S [+ I LEN] [I]; // 放出ループ 64 getnxt(); 65 KMP(); 66 } 67 } 68 }