#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int Next[100005],La,Lb;
void crtNext(char *a){//建立Next数组,表示a[j]与b[i]不匹配时
//a的下一个下标j
int i=0,j=-1;//这个i和j与cmp函数的不一样
Next[0]=-1;
while(i<La){
if(j==-1||a[j]==a[i]){
i++;j++;
if(a[i]==a[j])
Next[i]=Next[j];
else Next[i]=j;
}
else j=Next[j];
}
}
int cmp(char *a,char *b,int La,int Lb){
int i=0,j=0,cnt=0;
for(i=0;i<Lb;i++){
if(a[j]!=b[i])j=Next[j];//不相等j就移动
if(b[i]==a[j]||j==-1){
j++;
}
if(j==La){//用strlen(a)会超时
cnt++;
j=Next[j];
}
}//大括号要写对,for循环的内容很重要
return cnt;
}
int main()
{
int n,i,j,ans;
char a[10005],b[1000005];
scanf("%d",&n);
while(n--){
scanf("%s",a);
scanf("%s",b);
La=strlen(a);
Lb=strlen(b);//只计算一次字符的长度
crtNext(a);//strlen会耗时
ans=cmp(a,b,La,Lb);
cout<<ans<<endl;
}
return 0;
}
http://www.cnblogs.com/yjiyjige/p/3263858.html
这是大佬写的博客。Kmp算法
这题搞了这么久,一直超时,就是因为一直用strlen函数,每用一次就耗一点时间
问了大佬,瞬间解决。