上数据结构才学KMP算法。。。
刷一道练习题。。。
#include<cstdio>
#include<iostream>
#include<cstring>
#define M 1000000+10
#define N 10000+10
using namespace std;
char w[N];
char t[M];
int next[N];
int cnt;
void get_next(int len)
{
int i=1,j=0;
next[1]=0;
while(i<=len)
{
if(j==0 || w[i]==w[j])
{
++i;++j;
if(w[i]!=w[j])
next[i]=j;
else
next[i]=next[j];
}
else j=next[j];
}
}
void KMP()
{
int L1=strlen(w+1),L2=strlen(t+1);
//cout<<"L1="<<L1<<" "<<"L2="<<L2<<endl;
int i = 1,j=1;
while(j<=L1 && i<=L2)
{
if(j==0 || t[i]==w[j])
{
++i;
++j;
}
else j=next[j];
if(j==L1+1)
{
cnt++;
j = next[j];
}
}
}
int main()
{
int T,ll,tmp;
scanf("%d",&T);
getchar();
while(T--)
{
memset(w,0,sizeof(w));
memset(t,0,sizeof(t));
memset(next,0,sizeof(next));
gets(w+1);
gets(t+1);
ll = strlen(w+1);
get_next(ll);
cnt=0;
KMP();
printf("%d\n",cnt);
}
return 0;
}