题目链接:https://vjudge.net/contest/216955#problem/Bhttps://vjudge.net/contest/216955#problem/B
思路:数字串的匹配与字符串的匹配相似,无非就是一个用字符数组存储比较字符,一个用int数组存储。
代码
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000005;
int a[maxn],b[maxn];
int Next[maxn];
int N;
void get_next(int *t,int len){ //求解Next数组
int i=0,j=-1;
Next[0]=-1;
while(i<len){
if(j==-1||t[i]==t[j]){
i++;
j++;
Next[i]=j;
}
else j=Next[j];
}
}
int kmp(int *p,int *t,int len1,int len2){
int i=0,j=0;
int ans=0;
while(i<len1&&j<len2){ //当模式串匹配结束后,循环跳出,i所记录的值见图
if(j==-1||p[i]==t[j]){
i++;
j++;
}
else j=Next[j];
}
if(j==len2)return i-len2+1; //返回第一次匹配成功时的头位置
else return -1; //没找到返回-1
}
int main(){
cin>>N;
while(N--){
int len1,len2,i,v;
cin>>len1>>len2;
for(i=0;i<len1;i++){
cin>>a[i];
}
for(int i=0;i<len2;i++){
cin>>b[i];
}
get_next(b,len2);
int ans=kmp(a,b,len1,len2);
cout<<ans<<endl;
}
return 0;
}
图解