字符串处理,很简单的一道KMP算法模板;
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define N 1000010
int next[N];
char str1[10009],str2[N];
void creat_next(char *str1)
{
int len=strlen(str1);
next[0]=0;
int j=0;
for(int i=1; i<len; i++)
{
while(j>0&&str1[j]!=str1[i])
j=next[j-1];
if(str1[j]==str1[i])
j++;
next[i]=j;
}
}
int KMP(char *str1,char *str2)
{
int len2=strlen(str2),len1=strlen(str1);
int j=0,ans=0;
for(int i=0; i<len2; i++)
{
if(str1[j]!=str2[i]&&j>0)
j=next[j-1];
if(str1[j]==str2[i])
j++;
if(j==len1)
{
ans++;
j=next[j-1];//这里要注意,当找到一个子串后,j不要从0开始找,不然会超时= =
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",str1,str2);
creat_next(str1);
printf("%d\n",KMP(str1,str2));
}
return 0;
}