번호 순서 HDU - 1711 (KMP 템플릿 제목)

숫자의 두 시퀀스 주어 : A [1], A [2], ..., A [N] 및 B [1], [2], ..., B [M] B (1 <= M <= 10000, 1 <= N <= 1000000). [- 1 K + M] = B [당신의 작업은 [K] = B를 [1], A [K + 1] = B를 [2], ..., a를 숫자 K를 찾을 수 있습니다 엠]. 이 경우 하나 이상의 K 출력, 가장 작은 존재한다. 

입력 InputThe 첫번째 줄은 경우의 수를 나타내는 숫자 T이다. 각각의 사건은 세 줄이 포함되어 있습니다. 첫 번째 라인은 두 숫자 N과 M (1 <= M <= 10000, 1 <= N <= 1000000)이다. 두 번째 행은 N 나타내는 정수를 포함하는 [1], A [2], ..., A [N]. 세 번째 행 (B)을 나타내는 정수 M을 포함 [1], B [2], ..., B [M]. 모든 정수 [-1000000 1000000]의 범위이다. 
각 테스트 케이스 OutputFor, 당신은 출력 만 K를 포함하는 하나 개의 라인은 위에서 설명한한다. 그런 K가 존재하지 않는, 출력 -1 대신합니다. 
샘플 입력

(2) 
13 5 
1 2 1 2 3 1 2 3 1 2 3 1 2 
1 2 3 1 3 
13 5 
1 2 1 2 3 1 2 3 1 2 3 1 2 
1 2 3 2 1

샘플 출력

. 6 
-1 
코드 :
1 #INCLUDE <. 비트 / stdc ++ H>
 2  사용  스페이스 성병;
3  CONST의  INT maxn 1E6 + = 10 ;
4  INT의 N, m;
5  INT A [maxn];
6  의 INT B [maxn];
7  의 INT NEX [maxn];
8  
9  공극 GETNEXT ()
 10  {
 11      INT의 I = 1 , J = 0 ;
12      [NEX 1 ] = 0 ;
13 일      동안 은 (i < m)을
 14      {
(15)          만약 (j의 == 0 || B [I] == B의 [j를])
 16          {
 17              난, J ++ ++ ;
18              의 경우 (! B [I] = B [J]) NEX [내가] = J;
19              다른 NEX [I] = NEX [J]
20          }
 21          사람의 J = NEX [J]
22      }
 23  }
 24  
25  INT의 KMP ()
 26  {
 27      INT의 I, J; I = J = 1 ;
28 일      동안 (ⅰ <= N && J <= m)
 29      {
 30         만약 (j == 0 || A [I] == B [j를])는 I, J를 ++ ++ ;
31          사람의 J = NEX [J]
32      }
 33      만약 (j> m)
 34          리턴 I - m;
35      다른  수익률 - 1 ;
36  }
 37  
38  INT ) (주
 39  {
 40      INT의 T; CIN >> T;
41      동안 (T-- )
 42      {
 43          CIN >> >> N m;
44           (int로 I = 1 ; 난 = <N; I ++ )
 (45)              는 scanf ( " %의 D ' , A + I);
(46)          에 대한이 ( 값 int = 1을 1 ; 나는 <= m; 내가 ++ )
 (47)              는 scanf ( " %의 D ' , B + i)를;
48          GETNEXT ();
49          INT 입술 = KMP ();
50          COUT << 입술 << ENDL;
51      }
 52 }

 

 

추천

출처www.cnblogs.com/liuwenhan/p/11445654.html