KMP,只不过由字符串变成长整形而已,套模板可过。
S[]存放主串,T[]存放匹配串,T[0]和S[0]表示串的长度
AC代码:
/*HDOJ1711
作者:陈佳润
2013-05-02*/
#include<stdio.h>
long next[10005];
long S[1000005],T[10005];
void Get_next(long T[]){//构造next数组
int i=1,j=0;
next[1]=0;
while(i<T[0]){
if(j==0||T[i]==T[j]){
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
//s[0]和T[0]保存数组长度
int KMP(long S[],long T[]){
int i=0,j=0;
while(i<=S[0]&&j<=T[0]){
if(j==0||S[i]==T[j]){//
i++;
j++;
}else{
j=next[j];
}
}
if(j>T[0])
return i-T[0];//匹配成功,返回起始位置
else
return -1;//匹配失败
}
int main(){
int i,Time;
scanf("%d",&Time);
while(Time--){
scanf("%d%d",&S[0],&T[0]);
for(i=1;i<=S[0];i++)
scanf("%d",&S[i]);
for(i=1;i<=T[0];i++)
scanf("%d",&T[i]);
Get_next(T);
printf("%d\n",KMP(S,T));
}
return 0;
}