题目:
好后缀
我们称一个字符串的后缀为好后缀,如果它满足如下条件:
(1)它在字符串中至少出现2次;
(2)满足条件(1)的最长者。
请编写程序计算一个字符串的好后缀长度,注意一个字符串不能称为自己的后缀。
输入格式
输入为一个字符串,包含不超过105 个字母。
输出格式
输出为一个整数,表示输入字符串的好后缀长度。
输入样例1:
xacbacba
输出样例1:
4
输入样例2:
yxxabacaba
输出样例2:
3
输入样例3:
abc
输出样例3:
0
代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void cal_next(string str, int* next, int len)
{
next[0] = -1;
int k = -1;
for (int q = 1; q <= len - 1; q++)
{
while (k > -1 && str[k + 1] != str[q])
{
k = next[k];
}
if (str[k + 1] == str[q])
{
k = k + 1;
}
next[q] = k;
}
}
int main() {
ios::sync_with_stdio(false);
string p;
cin >> p;
int max = -1;
int* next = new int[p.size()];
reverse(p.begin(), p.end());
cal_next(p, next, p.size());
for (int i = 0; i < p.size(); i++) {
if (next[i] > max) max = next[i];
}
cout << max+1;
}