题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1711
题目意思:
找出b在a中的起始位置,没有则是-1
解题思路:
裸的KMP,不多说
不会KMP的话可以去看http://www.cppblog.com/oosky/archive/2006/07/06/9486.html
说的非常好
模板我是拿的大白的
代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10000+10;
const int maxn2 = 1000000+10;
int a[maxn2];
int b[maxn];
int next[maxn];
void getnext(int T[],int len,int* qnext)
{
qnext[0] = 0;
qnext[1] = 0;
for(int i=1;i<len;i++)
{
int j = qnext[i];
while(j && T[i]!=T[j]) j = qnext[j];
qnext[i+1] = (T[i]==T[j])?j+1:0;
}
}
int KMP(int S[],int T[],int len1,int len2)
{
getnext(T,len2,next);
int j=0;
for(int i=0;i<len1;i++)
{
while(j && S[i]!=T[j]) j = next[j];
if(T[j] == S[i])
j++;
if(j==len2)//已经找到匹配串
{
return i-len2+1;
}
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
int n,m;
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]);
int ans = KMP(a,b,n,m);
if(ans != -1)
printf("%d\n",ans+1);
else
printf("-1\n");
}
return 0;
}