Oulipo POJ - 3461
裸的KMP
代码如下:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1000000+10;
int arrnext[maxn],lenT,lenW;
char W[maxn],T[maxn];
void creatnext(char *W)
{
int i=0,j=-1;
arrnext[0]=-1;
lenT=strlen(T);
while(i<lenT)
{
if(j==-1||W[i]==W[j])
{
i++;
j++;
arrnext[i]=j;
}
else j=arrnext[j];
}
}
int KMP(char *W,char *T)
{
int cnt=0,i=0,j=0;
lenW=strlen(W);
while(i<lenT)
{
if(j==-1||T[i]==W[j])
{
i++;
j++;
}
else j=arrnext[j];
if(j==lenW)
{
cnt++;
// j=arrnext[j];
}
}
return cnt;
}
int main()
{
int kase;
cin >> kase;
while(kase--)
{
scanf("%s %s",W,T);
creatnext(W);
cout << KMP(W,T) << endl;
}
return 0;
}
这题第一次超时了,后来想了想应该是用cin输入输出导致,完全换成c的写法就过了,如果关了cin 和 scanf同步时间差不多也能ac.另外数组名起为next竟然不可以,应该是此变量和一些已经写好的某些函数类等重名。