码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2752 Seek the Name, Seek the Fame【KMP】

时间:2015-04-21 09:34:38      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://poj.org/problem?id=2752


题目大意:

给定一个字符串S,计算出所有可能的前缀-后缀字符串的长度。前缀-后缀字符串指的是S的

子串不仅是S的前缀,还是S的后缀。比如S = "alala",前缀-后缀字符有{"a","ala","alala"}。


思路:

KMP算法的应用。在KMP算法中,当字符串匹配失败时,模式串的指针并没有指向0从头比

较,而是指向了一个特定的位置,因为这个Next[j]指向的位置pos前长度为Next[pos]的子

串,同模式串第j位前的长度为Next[j]的子串是相同的。为了找到既能做前缀又能做后缀的子

串,纳闷可以找Next[len]前的长度为Next[len]的子串,这个子串一定是前缀,又由Next函

数的性质可知,这个前缀字符串长度和字符串长度为Next[len]的后缀是相同的,这样就找到

除S本身以外所有满足条件的子串。也可以找到所有满足条件的子串长度。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 400010;

char str[MAXN];
int Next[MAXN],ans[MAXN],len;
void GetNext()
{
    int i = 0,j = -1;
    Next[0] = -1;
    while(i < len)
    {
        if(j == -1 || str[i] == str[j])
        {
            i++,j++;
            Next[i] = j;
        }
        else
            j = Next[j];
    }
}

int main()
{
    while(cin >> str)
    {
        len = strlen(str);
        GetNext();
        ans[0] = len;
        int id = 1,i = len;
        while(Next[i] > 0)
        {
            ans[id++] = Next[i];
            i = Next[i];
        }

        for(i = id-1; i >= 0; i--)
            cout << ans[i] << ' ';
        cout << endl;
    }


    return 0;
}


POJ2752 Seek the Name, Seek the Fame【KMP】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45165787

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!