题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
题解:KMP模版题
使用"输入外挂"时间缩短很多(484ms-->156ms)
"输入外挂":http://blog.csdn.net/niushuai666/article/details/6689043
#include <stdio.h>
#include <string.h>
#define MAXN 1000002
int next[10002],n,m;
int str[MAXN],pattern[10002];
int Scan()// 该外挂适合纯数字输入
{
int res = 0, ch, flag = 0;
if((ch = getchar()) == '-') //判断正负
flag = 1;
else if(ch >= '0' && ch <= '9') //得到完整的数
res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9' )
res = res * 10 + ch - '0';
return flag ? -res : res;
}
void getNext()
{
int i,j;
i=0;
j=-1;
next[0]=-1;
while(i<m)
{
if (j==-1||pattern[i]==pattern[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int KMP()
{
int i,j;
i=j=0;
getNext();
while(i<n)
{
if(j==-1||str[i]==pattern[j])
{
i++;
j++;
if(j==m)
return i-j+1;
}
else
j=next[j];
}
return -1;
}
int main()
{
int test,i,ans;
scanf("%d",&test);
while (test--)
{
scanf("%d %d",&n,&m);
for(i=0;i<n;++i)
//scanf("%d",&str[i]);
str[i]=Scan();
for(i=0;i<m;++i)
//scanf("%d",&pattern[i]);
pattern[i]=Scan();
ans=KMP();
printf("%d\n",ans);
}
return 0;
}