Hdoj 1686 Oulipo

/*
Problem :
Status  :

By wf,
*/

#include "algorithm"
#include "iostream"
#include "cstring"
#include "cstdio"
#include "string"
#include "stack"
#include "cmath"
#include "queue"
#include "set"
#include "map"

#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1

typedef long long ll;
using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=1e6+5;


char sub[10000+5];
char str[maxn];

//刘汝佳
int f[10000+5];
void getFail(char* P,int * f)
{
    int m = strlen(P);
    f[0]=0;f[1]=0;
    for(int i=1;i<m;++i)
    {
        int j = f[i];
        while(j && P[i]!=P[j])j=f[j];
        f[i+1] = P[i]==P[j] ? j+1 :0;
    }
}

void kmp(char*T,char * P,int *f)
{
    int ret = 0;
    int n = strlen(T),m = strlen(P);
    getFail(P,f);
    int j=0;
    for(int i=0;i<n;++i)
    {
        while(j && P[j]!=T[i]) j = f[j];
        if(P[j]==T[i])j++;
        if(j==m)
        {
            ret++;
            //printf("%d
",i-m+1);
        }

    }
    printf("%d
",ret);
}

/*
kuangbin
void getFail(char P[],int f[])
{
    int m = strlen(P);
    int i=0,j=-1;
    f[0]=-1;
    while(i<m)
    {
       while(-1!=j && P[i]!=P[j])j=f[j];
       f[++i]=++j;
    }
    for(int i=0;i<m;++i)printf("%d ",f[i]);
    printf("
");
}

void kmp(char T[],char P[],int f[])
{
    int ret = 0;
    int n = strlen(T),m = strlen(P);
    //printf("n==%d , m==%d
",n,m);
    getFail(P,f);
    int i=0,j=0;
    while(i<n )
    {
        while(-1!=j && T[i]!=P[j])j=f[j];
        ++i;++j;
        if(j>=m)
        {
            ret++;
            j=f[j];
        }
    }
    printf("ret==%d
",ret);
}
*/

int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",&sub);
        scanf("%s",&str);
        //printf("%s
",sub);
        //printf("%s
",str);
        kmp(str,sub,f);
    }

    return 0;
}

  

原文地址:https://www.cnblogs.com/bruce27/p/5484541.html