poj2752 KMP

 需要理解next[]的意义。之前看到大牛的博客,next[]讲的非常清楚。

利用next[],当前位子的前面那一段和next[当前位子]的前面那一段是相同的。又next[next[当前位子]]与next[当前位子]有一段相同,所以当前位子的前面一段和

next[next[当前位子]]的前一段有相同即可。

#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
#define maxn 400010
int next[maxn];
char s[maxn];
void getnext()
{
    int j,k,len=strlen(s);
    next[0]=-1;
    j=0;
    k=-1;
    while(j<len)
    {
        if(k==-1||s[j]==s[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else k=next[k];
    }
}
int main()
{
    int i,j,flag;
    while(scanf("%s",s)!=EOF)
    {
        flag=0;
        stack<int>sta;
        getnext();
        i=strlen(s);
        sta.push(i);
        while(next[i]!=0)
        {
            sta.push(next[i]);
            i=next[i];
        }
        while(!sta.empty())
        {
            int ans=sta.top();
            sta.pop();
            if(flag==0)
            {
                flag=1;
                printf("%d",ans);
            }
            else printf(" %d",ans);
        }
        printf("
");
    }
}
原文地址:https://www.cnblogs.com/sweat123/p/4717042.html