1. 程式人生 > >Seek the Name, Seek the Fame POJ - 2752 (KMP 失配指標陣列)

Seek the Name, Seek the Fame POJ - 2752 (KMP 失配指標陣列)

題意:

    給定一個串T,找出串T的子串,該串即既是T的字首也是T的字尾.從小到大輸出所有符合要求的子串的長度.

分析:
  把答案就是f[m]  f[ f[m] ]...依次下去.理解f陣列的字首字尾思想這道題就迎刃而解了.

 

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e7;
char t[maxn],p[maxn];

int f[maxn];
int n,m;

void getfail()
{
    f[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;
    }
}

int  kmp()
{
    getfail();
    int j=0;
    for(int i=0;i<n;i++)
    {
        while(j && t[i]!=p[j])j=f[j];
        if(t[i]==p[j])j++;
        if(i==n-1)return j;
    }
}

int main()
{
    while(scanf("%s %s",p,t)!=EOF)
    {
        n=strlen(t);
        m=strlen(p);
        int tmp=kmp();
        if(tmp==0)
            puts("0");
        else
        {
            for(int i=0;i<tmp;i++)
                printf("%c",p[i]);
            printf(" %d\n",tmp);
        }
    }
}