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;
}

  

posted on 2011-07-22 20:17  sysu_mjc  阅读(124)  评论(0编辑  收藏  举报

导航