poj 2752

来源:互联网 发布:js对象排序函数 编辑:程序博客网 时间:2024/06/07 14:10

题意为:给一个字符串,找出又是前缀又是后缀的子字符串的长度,从小到大输出。


解法:利用kmp中的next数组来求解这个问题就很简单了。

首先,我们应该理解kmp算法中的next数组含义:当失去匹配之后,只需要回退一些,不需要从0开始。

也就是对于一个下标j,next[j]的值代表回退过去的位置,next[j]之前的字符串已经匹配成功过。所以不需要再次匹配


那对于这道题来说,自身肯定符合要求。

然后我们需要明白一个事实:前缀的最后一个字符肯定和这个字符串的最后一个字符相等。

这样我们只要不断rollback就可以了。

用了一个递归函数输出长度。


/*  题意:就是给出一个字符串,求既是前缀又是后缀  的串的长度,从小到大输出来  思路:next数组的使用*/#include<iostream>#include<string>using namespace std;int Next[400001], res[400001];string str;void getnext(int len){Next[0] = -1;int i = 0, j = -1;while (i < len){if (j == -1 || str[i] == str[j]){++i, ++j;Next[i] = j;}else{j = Next[j];}}}void T(int x){if (Next[x] == -1) return;T(Next[x]);cout << x << " ";}int main(){while (cin >> str){getnext(str.length());T(str.length());cout << endl;}return 0;}


0 0
原创粉丝点击