http://acm.hdu.edu.cn/showproblem.php?pid=2594

好题,做完之后直接对KMP的理解提升一个档次。

主要考察对_next数组含义的理解,之前的理解有点模糊,卡了两个半小时。

View Code
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std ; 
int m;
char a[50010],b[100010];
int _next[100010];
void Init_()
{
    int i,k;
    i = 0; k = -1; _next[0] = -1;  
    while(i < m){  
        if(k == -1 || b[i] == b[k]){  
            i++;k++;  
            _next[i] = k;   
        }  
        else  
            k = _next[k];  
    }  
}
int main()
{
    while(~scanf("%s%s",b,a))
    {
        int len1=strlen(b);
        int len2=strlen(a);
        strcat(b,a);
        m=strlen(b);
        Init_();
        int minx=min(len1,len2);
        while(1)
        {
            if(_next[m]<=minx)break;
            m=_next[m];
        }
        int ans=_next[m];
        if(!ans)
            puts("0");
        else
        {
            for(int i=0;i<ans;i++)
                putchar(b[i]);
            printf(" %d\n",ans);
        }
    }
    return 0;
}