题目意思:
很裸的字符串匹配,输入2组数字,如果匹配了,输出起始位置,否则,输出-1.
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=1711
题目算法:
KMP算法,n+m的复杂度。
1、 子串的next构建
2、 匹配的思路。值得注意。
题目代码:
#include<iostream>
#include<cstdio>
using namespace std;
int t,n,m;
int a[1000000+6],b[10000+4];
int next[10000+4];
void get_nextvalue(int *c,int ne[]){
int i=0,k=-1;
ne[0]=-1;
while(i<m){
if(k==-1||c[i]==c[k]){
i++,k++;
if(c[i]!=c[k])
ne[i]=k;
else ne[i]=ne[k];
}
else k=ne[k];
}
}
int KMP(){
int pn=0,pm=0;
while(pn<n){
if(a[pn]==b[pm]){
if(pm==m-1)
return pn-pm+1;
pn++,pm++;
}
else{
pm=next[pm];
if(pm==-1){pm=0;pn++;}
}
}
return -1;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",a+i);
for(int i=0;i<m;i++)
scanf("%d",b+i);
get_nextvalue(b,next);
// for(int i=0;i<m;i++)
// printf("%d ",next[i]);
// printf("\n");
int ok=KMP();
printf("%d\n",ok);
}
return 0;
}