POJ

来源:互联网 发布:java破解验证码 编辑:程序博客网 时间:2024/06/03 22:05

点我看题

题意:找出字符串S前后缀相同的串的长度,升序输出。

分析:简单KMP,emmm很激动自己想出来了,虽然简单,不多说考虑前后缀相同的字符串对应字符是相同的。

//但是用set存答案T了,直接用数组就A了。

参考代码:

#include<cstdio>#include<cmath>#include<cstring>#include<set>#include<algorithm>#include<iostream>using namespace std;const int maxn = 1e6+10;int n;char S[maxn];int nxt[maxn];int ans[maxn];void GetNext(){    int i = 0, j = -1;    nxt[0] = -1;    while( i < n)    {        if( j == -1 || S[i] == S[j])            nxt[++i] = ++j;        else            j = nxt[j];    }}int main(){    while( ~scanf("%s",S))    {        n = strlen(S);        GetNext();        // for( int i = 0; i <= n; i++)        //     printf("%d ",nxt[i]);        // puts("");        int p = nxt[n];        int len = 0;        while( p)        {            ans[len++] = p;            p = nxt[p];        }        for( int i = len-1; i >= 0; i--)            printf("%d ",ans[i]);        printf("%d\n",n);        // for( set<int> :: iterator it = ans.begin(); it != ans.end(); it++)        //     printf("%d ",*it);        // printf("%d\n",n);    }    return 0;}


原创粉丝点击