求W在T中第一次出现的位置
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int Next[1111111]; int T[1111111],W[1111111]; int n,m; void getNext() { int j = 0, k = -1; Next[0] = -1; while(j < m) { if(k == -1 || W[j] == W[k]) Next[++j] = ++k; else k = Next[k]; } } int Match() { getNext(); for(int i = 0 , j = 0; i < n ; i++) { while(j > 0 && W[j] != T[i]) j = Next[j]; if(W[j] == T[i]) j++; if(j == m) { return i + 1 - m + 1; } } return n; } int main() { int Test; scanf("%d",&Test); while(Test--) { memset(Next , 0 ,sizeof(Next)); scanf("%d%d",&n,&m); for(int i = 0 ; i < n ; i++) { scanf("%d",&T[i]); } for(int i = 0 ; i < m ; i++) { scanf("%d",&W[i]); } int ans = Match(); if(ans == n) { cout << "-1" << endl; } else { cout << ans << endl; } } }