[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; } ```

相关推荐
mit6.8249 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
啊阿狸不会拉杆11 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路11 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
曙曙学编程12 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
△曉風殘月〆12 小时前
Visual Studio中的常用调试功能(下)
c++·ide·visual studio·调试
武当豆豆12 小时前
C++编程学习(第25天)
开发语言·c++·学习
minji...16 小时前
C++ string类(STL简介 , string类 , 访问修改字符)
开发语言·c++
Forward♞16 小时前
Qt——文件操作
开发语言·c++·qt
十五年专注C++开发16 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建
winds~18 小时前
【git】 撤销revert一次commit中的某几个文件
linux·c++