POJ2752

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>


using namespace std;


#define maxn 400000
int next[maxn + 2];
char p[maxn + 2];
int num[maxn];


void kmp(char p[])
{
    int m = strlen(p + 1);
    next[1] = 0;
    for( int k = 0, q = 2;q<=m ;q++)
    {
        while( k >0 && p[k+1] != p[q])
             k = next[k];


        if(p[k+1] == p[q])
         k++;
        next[q] = k;
    }


}




int main()
{
    while( scanf("%s",p+1)!=EOF)
    {
        kmp(p);
        int len = strlen(p+1);
        int n = 0;
         num[n++] = len;
        while( next[len] != 0)
        {
            num[n++] = next[len];
            len = next[len];
        }
        sort(num,num+n);
       for( int i = 0; i<n; i++)
       {
           printf("%d",num[i]);
           printf("%c",i == n - 1 ?'\n': ' ');
       }
    }
}

你可能感兴趣的:(POJ2752)