hdu2594kmp

把两个串连起来 求next[]数组

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N=50000+5;
char a[N*2],b[N];
int nex[N*2];

void getnext()
{
    nex[0]=-1;
    int i=1,j=0,len=strlen(a);
    while(i<len)
    {
        if(j==-1||a[i]==a[j])
        {
            i++;j++;
            nex[i]=j;
        }
        else
            j=nex[j];
    }
}

int main ()
{
    while(~scanf("%s%s",a,b))
    {
        int lena=strlen(a),lenb=strlen(b);
        strcat(a,b);
        getnext();
        int ans=nex[strlen(a)];
        while(ans>lenb||ans>lena) ans=nex[ans];//直到长度小等于短串的长度
        if(ans==0) printf("0\n");
        else
        {
            a[ans]=0;//去掉后面的就是前缀啦
            printf("%s %d\n",a,ans);
        }
    }
    return 0;
}

你可能感兴趣的:(hdu2594kmp)