poj3461~KMP水水水题~_KMP

又花了半个小时的时间去回忆几个月前学的过,当时又心急了,担心自己什么想不起来,骂自己 笨,还好很快就想起来了,然后利用了模板

#include<iostream>
#include<string>
#include<fstream>
using namespace std;

int next[10005];
char t[10005],s[1000005];

void Getnext(char a[],int *next,int n)
{
int i,j;
j=-1;
i=0;
next[0]=-1;
while(i<n)
if(j==-1||a[i]==a[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}

int KMP(char S[],char T[]) //S是主串,T是子串
{
int i=0,j=0,sum=0,lenT,lenS;
lenT=strlen(T);
lenS=strlen(S);
Getnext(T,next,lenT);
while(i<lenS)
{
if(j==-1||S[i]==T[j])
{
i++;
j++;
if(j>=lenT) //如果子串匹配成功,sum++,后面的那个i继续与
{ //next【j】开始匹配
j=next[j];
sum++;
}
}
else j=next[j];
}
return sum;
}


int main()
{
int i,j,x;
cin>>x;
while(x--)
{
scanf("%s%s",t,s);
printf("%d\n",KMP(s,t));
}
}