poj 3461 Oulipo
#include <iostream> //KMP算法
using namespace std;
char A[5000000],B[5000000];
int n,m,next[5000000],res;
void get_next()
{
next[1]=0;
int j=0;
for(int i=2;i<=m;++i)
{
while(j>0&&B[j+1]!=B[i])
j=next[j];
if(B[j+1]==B[i])
j=j+1;
next[i]=j;
}
}
void kmp()
{
res=0;
int j=0;
for(int i=1;i<=n;++i)
{
while(j>0&&B[j+1]!=A[i])
j=next[j];
if(B[j+1]==A[i])
j=j+1;
if(j==m)
{
res++;
j=next[j];
}
}
cout<<res<<endl;
}
int main()
{
int s;
cin>>s;
while(s--)
{
scanf("%s %s",B+1,A+1);
for(n=0;A[n+1]!='\0';++n);
for(m=0;B[m+1]!='\0';++m);
get_next();
kmp();
}
return 0;
}