当前位置: 首页 > news >正文

东方博宜OJ 2360:最多子串重复次数 ← KMP算法 + 循环节

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

【题目描述】
给定若干个长度≤10^6 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。
如:ababab 则最多有 3 个 ab 连接而成。

【输入格式】
输入若干行(所有行的字符串的长度之和≤10^7),每行有一个字符串,字符串仅含英语小写字母。特别的,字符串可能为 . ,即一个半角句号,此时输入结束。

【输出格式】
对于每行输入,输出一个整数,代表计算的结果。​​​​​​​

【输入样例】
abcd
aaaa
ababab
.​​​​​​​

【输出样例】
1
4
3

【数据范围】
字符串长度≤10^6,
所有行的字符串的长度之和≤10^7。

【算法分析】
● 循环节:https://blog.csdn.net/hnjzsyjyj/article/details/146168602

● 理解 KMP 算法中 next 数组涵义所需的几个概念
(1)非平凡前缀,指除了最后一个字符以外,一个字符串的全部头部组合。简称前缀。
(2)非平凡后缀,指除了第一个字符以外,一个字符串的全部尾部组合。简称后缀。
(3)最长公共前后缀,指一个字符串的最长且相等的前缀与后缀。例如,字符串 ABCxyzABC 的最长公共前后缀为 ABC。

● next 数组的涵义:next[i] 表示字符串前 i 个字符的最长公共前后缀长度。
例如,字符串 "ABABA" 的前 3 个字符 "ABA" 的最长公共前后缀为 "A",长度为 1;前 5 个字符 "ABABA" 的最长公共前后缀为 "ABC",长度为 3。
这可由字符串 "ABABA" 的 next 数组(字符串下标从 1 开始)进行验证。例如,next[3]=1,next[5]=3。

i          1    2    3    4    5
T         A    B    A    B    A
ne[i]    0    1    1    2    3

● 假设字符串 ‌s[1 ... i]‌ 由 ‌k‌ 个循环节 ‌P 构成,总长度 ‌i=kL‌。其中,L 为循环节长度。
由 next 数组的涵义知,next[i]‌ 等于 ‌k-1‌ 个循环节的总长度,即 ‌next[i]=(k-1)L‌。
由 ‌i=kL‌ 和 ‌next[i]=(k-1)L‌ 联立得:‌L=i-next[i]‌‌

● 当 i%(i-next[i])==0 时,存在循环节。
循环节长度 L=i-next[i],循环次数 K=i/L=i/(i-next[i])
例如,aabaabaabaab 的 next 数组如下表所示(字符串下标从 1 开始)。

i          1    2    3    4    5    6    7    8    9    10    11    12
T         a    a    b    a    a    b    a    a    b     a      a       b
ne[i]    0    1    2    1    2    3    4    5    6    7      8       9

若 i=12 且 next[i]=9,则循环节长度 L=i-next[i]=12-9=3,循环次数 K=i/L=i/(i-next[i])=12/3=4,表示该前缀(或称子串)由长度为 3 的循环节重复 4 次构成‌。
​​​​​​​
【算法代码】

#include <bits/stdc++.h>
using namespace std;const int N=1e6+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];}
}int main() {string t;while(cin>>t) {if(t==".") break;int len=t.size();getNext(t);int L=len-ne[len];if(len%L==0) cout<<len/L<<endl;else cout<<1<<endl;}return 0;
}/*
in:
abcd
aaaa
ababab
.out:
1
4
3
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/160215718
https://blog.csdn.net/hnjzsyjyj/article/details/160224665
https://blog.csdn.net/hnjzsyjyj/article/details/146154773
https://blog.csdn.net/hnjzsyjyj/article/details/146168602

http://www.jsqmd.com/news/654466/

相关文章:

  • 【Java】封装:你的数据不该被随意触碰
  • Flash数字遗产的守护者:CefFlashBrowser如何让经典内容重获新生
  • OpenAI Chat Completion API 应用与使用指南
  • CAM++声纹识别系统案例分享:会议录音自动归档实战
  • 家庭游戏串流革命:用Sunshine打造你的私人云游戏服务器
  • STAR-CCM+内燃机缸内CFD仿真:从理论框架到代码实践
  • 聚焦重庆津诚青少年素质教育,满意度、案例及招生规模情况大揭秘 - 工业设备
  • 花岗岩路沿石定制厂家靠谱吗,有实力的厂家深度剖析 - 工业品网
  • 怎样在2024年完美运行Flash内容:现代用户的实用解决方案
  • 直播预告 | 密歇根州立大学刘思佳教授:从机器遗忘到更广泛的模型调控
  • SeqGPT-560M在卷积神经网络中的应用:图像文本联合分析
  • Nuitka 文件夹模块化打包
  • 2026年靠谱的车规级微控制器加工厂推荐,哪家售后好为你揭晓答案 - 工业品牌热点
  • Qwen3-14B RTX 4090D部署:TensorRT加速推理POC验证与性能对比
  • Wan2.1-UMT5进阶:利用LSTM时序模型优化视频连贯性
  • Python百度搜索API架构解析:无限制网页爬虫实现原理与性能优化
  • Fuchsia入门-简介和代码介绍
  • 飞书文档批量导出工具:一键备份团队知识资产
  • Pi0具身智能模型解释性分析与可视化工具使用指南
  • FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了
  • 基于Redis和Redisson实现分布式锁
  • 2026年多平台发布工具全攻略:10款高效自媒体管理软件深度评测与推荐
  • 5分钟掌握AMD Ryzen硬件调试:SMUDebugTool终极指南
  • Qwen3.5-9B Proteus仿真结合:为嵌入式项目生成说明文档与测试脚本
  • 职场真相:为何“会说”比“会做”更关键?这3件事,领导不问也得主动说
  • 细聊车规级MCU芯片制造厂哪家好,性价比与售后综合分析 - 工业推荐榜
  • ScriptCat中GM.xmlHttpRequest异步Promise机制深度解析与架构设计优化
  • iPhone充电慢怎么办?6个方法大幅缩短充电时间!
  • 从零构建RenderDoc扩展插件:打造自定义调试界面
  • Equalizer APO完整指南:免费打造Windows系统级音频均衡器