裸的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竟然不可以,应该是此变量和一些已经写好的某些函数类等重名。