东方博宜OJ 2362:前缀和后缀 ← KMP算法

【题目来源】
https://oj.czos.cn/p/2362

【题目描述】
给定若干由小写字母组成的字符串(这些字符串总长≤4×10^5),在每个字符串中求出所有既是前缀又是后缀的子串长度。例如:ababcababababcabab,既是前缀又是后缀的:ab,abab,ababcabab,ababcababababcabab。

【输入格式】
输入若干行,每行一个字符串。

【输出格式】
对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。

【输入样例】
ababcababababcabab
aaaaa

【输出样例】
2 4 9 18
1 2 3 4 5

【数据范围】
字符串总长≤4×10^5。

【算法分析】
● next\[\] 数组的涵义:++nexti 表示字符串前 i 个字符的最长公共前后缀长度++。

● 为什么递归 ne\[\] 数组就能找到所有答案?
答:字符串 ababcababababcabab 的 next数组值为:0 1 1 2 3 1 2 3 4 5 4 5 4 5 6 7 8 9。

|--------|---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|----|----|----|
| idx | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| T | a | b | a | b | c | a | b | a | b | a | b | a | b | c | a | b | a | b |
| ne\[\] | 0 | 1 | 1 | 2 | 3 | 1 | 2 | 3 | 4 | 5 | 4 | 5 | 4 | 5 | 6 | 7 | 8 | 9 |

ne18 = 9 → 前 18 个字符的最长相等前后缀长度 = 9
ne9 = 4 → 前 9 个字符的最长相等前后缀长度 = 4
ne4 = 2 → 前 4 个字符的最长相等前后缀长度 = 2
ne2 = 0 → 停止
所以所有答案:2 → 4 → 9 → 18

● KMP算法的next数组与前缀表的关系

【算法代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int N=4e5+5;
int ne[N];

void getNext(string t) {
    int len=t.length();
    int i=0,j=-1;
    ne[0]=-1;
    while(i<len) {
        if(j==-1 || t[i]==t[j]) {
            i++,j++;
            ne[i]=j;
        } else j=ne[j];
    }
}

void print(int x) {
    if(x==0) return;
    print(ne[x]);
    cout<<x<<" ";
}

int main() {
    string t;
    while(cin>>t) {
        int len=t.size();
        getNext(t);
        print(ne[len]);
        cout<<len<<endl;
    }
    return 0;
}

/*
in:
ababcababababcabab
aaaaa

out:
2 4 9 18
1 2 3 4 5
*/

【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/160215718
https://blog.csdn.net/hnjzsyjyj/article/details/127140892
https://blog.csdn.net/hnjzsyjyj/article/details/146059543

相关推荐
熊猫钓鱼>_>11 天前
开源鸿蒙平台 KMP 三方库 KStore 适配全流程:从 ohosArm64 target 到真机文件持久化验证
人工智能·华为·开源·ai编程·harmonyos·openharmony·kmp
熊猫钓鱼>_>13 天前
Kotlin Multiplatform for OpenHarmony 实战:为 KMPNotifier 实现 OpenHarmony 本地通知引擎
kotlin·ai编程·harmonyos·鸿蒙·openharmony·适配·kmp
熊猫钓鱼>_>19 天前
开源鸿蒙平台 KMP 三方库 Essenty 适配全流程:从生命周期抽象到状态重建验证
华为·开源·harmonyos·鸿蒙·kmp·atomgit·essenty
ai安歌1 个月前
开源鸿蒙平台 KMP/CMP 三方库「智感握姿」适配全流程
kmp
ai安歌1 个月前
开源鸿蒙平台KMP/CMP 服务卡片三方库适配从 0 到 1 实战
kmp
消失的旧时光-19432 个月前
(KMP-Net进阶)第一篇:AppResult<T>——网络层到底应该 throw,还是返回统一 Result?
网络·ktor·kmp
消失的旧时光-19432 个月前
第十篇:Ktor Custom Client Plugin:从 OkHttp Interceptor 真正理解请求与响应生命周期
okhttp·plugin·ktor·kmp
消失的旧时光-19432 个月前
第八篇:Ktor 异常体系:断网、Timeout、HTTP、JSON 与业务错误如何统一成 AppError
异常处理·ktor·kmp
消失的旧时光-19432 个月前
补充篇 8.1:Ktor/KMP 断网处理:为什么请求前要先判断网络状态?
ktor·kmp·networkclient
消失的旧时光-19432 个月前
第七篇:Ktor 统一响应模型:ApiResponse、业务 code 与 data 解包
ktor·kmp·net