代码
int fail[maxn];
void get_fail(int arry[], int l){
fail[0] = fail[1] = 0;
for(int i = 2, j = 0; i <= l; ++i){
while(j > 0 && arry[i] != arry[j+1]) j = fail[j];
if(arry[i] == arry[j+1]) ++j;
fail[i] = j;
}
}
int kmp(int arry[], int p, int mode[], int q){
get_fail(mode, q);
for(int i = 1, j = 0; i <= p; ++i){
while(j > 0 && arry[i] != mode[j+1]) j = fail[j];
if(arry[i] == mode[j+1]) ++j;
if(j == q) return i - q + 1;
}
return 0;
}