http://acm.hdu.edu.cn/showproblem.php?pid=1711
在这道题目中 我纠结了很久 一直不能提交 测试能成功 为什么交不了呢 我看了一下别人代码 发现差不多 但是最后还是发现有问题
在kmp()函数中if(j==0||s2[i]==s1[j]) 我把 j 写成了0了 其实 j=-1 的。所以如果交不了 可然还是自己的错了 一个细节就不能成功 细节也是很重要的
多向自己方面想想那错了 那你一定可以正确的 呵呵
ac 代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<iomanip>
using namespace std;
int s1[10003],s2[1000003];
int next[10003];
int N,M;
void get_next()
{
int i=0;
int j=-1;
next[0]=-1;
while(i<M)
{
if(j==-1||s1[i]==s1[j])
{
i++,j++;
next[i]=j;
}
else j=next[j];
}
}
int kmp()
{
int i=0;
int j=0;
next[1]=0;
if(M>N) return -1;
while(i<N&&j<M)
{
if(j==-1||s2[i]==s1[j])
{
i++,j++;
}
else j=next[j];
}
if(j>=M) return i-M+1;
else return -1;
}
int main()
{
int t,k;
cin>>t;
while(t--)
{
cin>>N>>M;
for(int i=0;i<N;i++) cin>>s2[i];
for(int i=0;i<M;i++) cin>>s1[i];
get_next();
k= kmp();
cout<<k<<endl;
}
return 0;
}