题意为:给一个字符串,找出又是前缀又是后缀的子字符串的长度,从小到大输出。
解法:利用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;
}