标题:重复模式 作为神的好朋友,技术男肖嘉在姜神生日时送给他一个超长字符串S。肖嘉要姜神在其中找出一个最长的字符串T,使得T在S中至少出现了两次,想说的秘密就藏在 由于字符串实在是太长了,姜神总是找不到合适的T。于是姜神请你帮他找到这个T的长度。 【输入格式】:行。一个字符串,即题目中说的S。 【输出格式】:行。一个整数,表示最长的T的长度。 【样例输入】:ababa 【样例输出】:3 「数据范围」 对于30%的数据,s长度<=100对于60%的数据,s长度<=8000对于100%的数据,s长度<=500000资源约定: 峰值内存消耗<256M CPU消耗<1000ms。写一个C语言代码。要求如上
时间: 2024-03-25 12:37:28 浏览: 132
以下是C语言代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 500010
char s[MAXN];
int next[MAXN];
int main()
{
scanf("%s", s + 1);
int len = strlen(s + 1);
int j = 0;
for (int i = 2; i <= len; i++) {
while (j && s[j + 1] != s[i]) j = next[j];
if (s[j + 1] == s[i]) j++;
next[i] = j;
}
int ans = 0;
for (int i = 2; i <= len; i++) {
if (next[next[i]] && next[i] != next[next[i]]) {
ans = next[i];
}
}
printf("%d\n", ans);
return 0;
}
```
思路解析:
本题可以使用 KMP 算法解决。KMP 算法中的 next 数组表示当前位置之前的最长相同前后缀的长度。我们可以遍历 next 数组,找到 next[next[i]] 不为 0 且 next[i] 不等于 next[next[i]] 的位置,即为最长的 T 的长度。
阅读全文