题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
题目大意:给定数组a[N],b[M],求出b在a中的最小匹配起点,下标从1开始
#include<cstdio>
int str[10100];//模式串
int txt[1000100];//文本串
int next[10100];
void get_next(int len){//模式串长度
int i=0;
int j=-1;
next[0]=-1;
while(i<len){
if(j==-1||str[i]==str[j]){
i++;
j++;
next[i]=j;
}else{
j=next[j];
}
}
}
int KMP(int len1,int len2){//文本串和模式串
int i=0,j=0;
while(i<len1){
if(j==-1||txt[i]==str[j]){
i++;
j++;
}else//失配
j=next[j];
if(j==len2)
return i;
}
return -1;//没找到
}
int main(){
int t;
scanf("%d",&t);
int len1,len2;
int i;
while(t--){
scanf("%d%d",&len1,&len2);
for(i=0;i<len1;++i){
scanf("%d",&txt[i]);
}
for(i=0;i<len2;++i){
scanf("%d",&str[i]);
}
get_next(len2);
int ans=KMP(len1,len2);
if(ans==-1){
printf("-1\n");
}else{
printf("%d\n",ans-len2+1);
}
}
return 0;
}
关于KMP算法的详解:http://blog.csdn.net/v_july_v/article/details/7041827