[POI2006] OKR-Periods of Words------最大周期长度(扩展最小周期长度)
原题链接\]([P3435 \[POI2006\] OKR-Periods of Words - 洛谷 \| 计算机科学教育新生态 (luogu.com.cn)](https://www.luogu.com.cn/problem/P3435)) *** ** * ** *** #### 字符串的周期 讲这道题之前,我们先聊一聊字符串的周期。我们要明确**周期** 和**border**两个概念 **周期** > 对字符串 s s s和 0 \< p ≤ ∣ s ∣ 0\
对字符串 s s s和 0 \< p \< ∣ s ∣ 0\
思路
现在我们回到该题:
该题就是让我们求字符串 s 1 s_1 s1的最小周期
代码
代码如下
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
char c[N];
int ne[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
// 字符串下标从1开始
cin >> n >> c + 1;
// 获取next数组
for (int i = 2, j = 0; i <= n; i ++) {
while (j && c[i] != c[j + 1])
j = ne[j];
if (c[i] == c[j + 1]) {
j ++;
ne[i] = j;
}
}
cout << n - ne[n];
return 0;
}
扩展:最大周期长度
让每一个next数组的值都是最短前缀
核心代码
cpp
int j = n;
// 转换为最短前缀
while (ne[j])
j = ne[j];
// 记忆化存储
if (ne[i]) ne[i] = j;
// 最大周期长度
len = n - j;
例题
\[POI2006\] OKR-Periods of Words\]([P3435 \[POI2006\] OKR-Periods of Words - 洛谷 \| 计算机科学教育新生态 (luogu.com.cn)](https://www.luogu.com.cn/problem/P3435))
> **分析**
>
> 求每个子串的最大周期长度
>
> **样例分析**
>
> bab 2
>
> baba 2
>
> babab 4
>
> bababa 4
>
> bababab 6
>
> babababa 6
**参考代码**
```cpp
#include