[POI2006] OKR-Periods of Words——最大周期长度(扩展最小周期长度)

[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 using namespace std; const int N = 1e6 + 10; typedef long long LL; char s[N]; LL ne[N]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n >> s + 1; for (int i = 2, j = 0; i <= n; i ++) { while (j && s[i] != s[j + 1]) j = ne[j]; if (s[i] == s[j+1]) j ++; ne[i] = j; } LL ans = 0; for (int i = 2; i <= n; i ++) { int j = i; while (ne[j]) { j = ne[j]; } if (ne[i]) ne[i] = j; ans += i-j; } cout << ans << endl; return 0; } ```

相关推荐
byxdaz20 分钟前
C++内存序
c++
优雅的潮叭35 分钟前
c++ 学习笔记之 malloc
c++·笔记·学习
苦藤新鸡3 小时前
8.最长的无重复字符的子串
c++·力扣
꧁Q༒ོγ꧂4 小时前
C++ 入门完全指南(四)--函数与模块化编程
开发语言·c++
汉克老师4 小时前
GESP2025年12月认证C++八级真题与解析(判断题8-10)
c++·快速排序··lcs·gesp八级·gesp8级
qq_433554544 小时前
C++ manacher(求解回文串问题)
开发语言·c++·算法
HL_风神5 小时前
设计原则之迪米特
c++·学习·设计模式
HL_风神5 小时前
设计原则之合成复用
c++·学习·设计模式
汉克老师5 小时前
GESP2025年12月认证C++八级真题与解析(单选题10-12)
c++·递归··gesp八级·gesp8级
bkspiderx6 小时前
C++中的map容器:键值对的有序管理与高效检索
开发语言·c++·stl·map