숫자의 두 시퀀스 주어 : 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 }