这一题真是让我纠结,,本以为kmp算法已经掌握很熟练了,木想到tle,,尼玛的什么kmp,然后又看了看书,,发现这竟然和我写的kmp不一样,于是按书重新写了一遍,竟然木有超时,,我表示很受伤啊!!
AC代码:
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
int Next[10001];
string a,b;
void kmp()
{ int n=a.size();
int m=b.size();
int k=-1;
Next[0]=-1;
for(int i=1;i<n;++i)
{ while(k>-1&&a[i]!=a[k+1]) k=Next[k];
if(a[i]==a[k+1]) k++;
Next[i]=k;
}
int sum=0,j=-1;
for(int i=0;i<m;++i)
{ while(j>-1&&b[i]!=a[j+1]) j=Next[j];
if(b[i]==a[j+1]) j++;
if(j==n-1) {sum++;j=Next[j];}
}
cout<<sum<<endl;
}
int main()
{ int Case;
cin>>Case;
while(Case--)
{ cin>>a>>b;
kmp();
}return 0;
}
下面贴出我超时的代码,望哪位神牛看到给指点一下,,,,
#include<iostream>
#include<string.h>
#include<cstdio>
#include<string>
using namespace std;
int nex[10001];
string a,b;
void kmp()
{ int n=a.size();
nex[0]=0;
int i=0,j=1;
while(j<n)
{
if(a[j]==a[i])
{ nex[j]=i+1;
i++;j++;
}
else{ if(i>0) i=nex[i-1];
else nex[j++]=0;
}
}
}
int main()
{ int Case;
scanf("%d",&Case);
while(Case--)
{ cin>>a>>b;
memset(nex,0,sizeof(nex));
kmp();
int i=0,j=0;
int n=b.size();
int m=a.size();
int sum=0;
while(i<n)
{ if(a[j]==b[i])
{
if(j==m-1) {sum++;j=nex[j-1];}
else {i++;j++;}
}
else{ if(j>0) j=nex[j-1];
else i++;
}
}
printf("%d\n",sum);
}return 0;
}