KMP算法
#include <iostream>
#include<cstdio>
#include <cstring>
using namespace std;
char p[10005],t[1000005];
int next[10005],len;
void getNext()
{
int j,k;
next[0]=-1;
j=0;
k=-1;
while(j<len)
{
if(k==-1||p[k]==p[j])
{
k++;
j++;
next[j]=k;
}
else
k=next[k];
}
}
int KMP() //const ±íʾº¯ÊýÄÚ²¿²»»á¸Ä±äÕâ¸ö²ÎÊýµÄÖµ¡£
{
int lent=strlen(t),lenp=strlen(p);
getNext();
int i=0,j=0,cont=0;
while(i<lent)
{
if(t[i]==p[j])
{
i++;
j++;
}
else
{
j=next[j];//zuida?
if(j==-1)
{
i++;
j=0;
}
}
if(j==lenp)
cont++;
}
return cont;
}
int main()//abCabCad
{
//getNext(pattern,n);
//get_nextval(pattern,n);
int cases;
scanf("%d",&cases);
while(cases--)
{
scanf("%s%s",p,t);
len=strlen(p);
cout<<KMP()<<endl;
}
return 0;
}