#include <iostream>
using namespace std;
const int maxn = 60010;
int s[maxn],a[maxn];
int * bulid(int* s,int len) {
int * next = new int[len];
next[0] = -1;
int p = 0;
int k = -1;
while (p<len-1) {
if(k==-1||s[p]==s[k]) {
p++;
k++;
next[p] = k;
} else {
k = next[k];
}
}
return next;
}
int main() {
int len1;
while (cin>>len1) {
for (int i=0;i<len1;i++) cin>>s[i];
int len2;
cin>>len2;
for (int i=0;i<len2;i++) cin>>a[i];
int i=0,j=0;
int* next = bulid(s,len1);
while (i<len1&&j<len2) {
if(i==-1||s[i]==a[j]) {
i++;
j++;
} else i = next[i];
}
delete []next;
if (i==len1) cout<<j-i<<endl;
else cout<<"no solution"<<endl;
}
}
kmp算法
最新推荐文章于 2025-03-16 21:24:27 发布