/66MS解法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char str[1000001];
char str1[20000];
int main(){
int n,i,j,next[20000],len1,len2,cont;
scanf("%d",&n);
while(n--){
scanf("%s",str1);
scanf("%s",str);
//kmp
i=0;
j=-1;
len1=strlen(str1);
len2=strlen(str);
next[0]=-1;
while(i<len1){
if(j==-1 || str1[i]==str1[j]){
++i;
++j;
next[i]=j;
}else j=next[j];
}
i=0;
j=0;
cont=0;
while(i<len2){
if(j==-1 || str1[j]==str[i] ){
++i;
++j;
}else j=next[j];
if(j>=len1){
cont++;
i-=next[len1];//根据病毒串最后跟自己匹配的长度 主串后退相应的长度
j=0;
}
}
printf("%d\n",cont);
}
return 0;
}
还有 为什么我上面的代码不能用 gun c提交啊郁闷- -
还有 老杨那代码 如果给组 病毒串长10000 主串长1000000的就超时了吧 时间复杂度要10000*999000吧