题目大意
给你两个字符串,给出第一个在第二个字符串中的出现次数,注意,有多组数据。
Time Limit: 1000MS Memory Limit: 65536K
经典KMP(貌似不是的)题目,十分容易。
#include <cstdio>
#include <cstring>
using namespace std;
int t,i,j,next[1000010],ans,l1,l2;
char s1[1000010],s2[100010];
int main(){
scanf("%d",&t);
while(t--){
scanf("%s%s",&s2,&s1);
l1=strlen(s1);
l2=strlen(s2);
i=0;
j=-1;
next[0]=-1;
while(i!=l2)//初始化,计算next函数值
if(j==-1||s1[i]==s1[j])
next[++i]=++j;
else
j=next[j];
i=0;j=0;ans=0;
while(i!=l1&&j!=l2){//KMP套算法就行了
if(j==-1||s1[i]==s2[j]){
i++;
j++;
}
else
j=next[j];
if(j==l2){
ans++;
j=next[j];
}
}
printf("%d\n",ans);
}
return 0;
}