hdu2203kmpマッチ

連結した文字列は、変位の問題を解決することができます。

コードは以下の通りであります:

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型私は= - 125      一方(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   }

 

おすすめ

転載: www.cnblogs.com/randy-lo/p/12516750.html