Power Strings
https://loj.ac/problem/10035
题目描述
给出一个字符串,求它的最小循环节。
思路
之前讲过\(Hash\)的做法,不过这也是\(KMP\)的模板题。
我们有结论:若\(n\%(n - p [ n ])==0\),最小循环节长度为\(n/(n - p [ n ])\);否则就为它本身。
我们对着证明考虑两部分,一是可以整除时为什么这是答案,而是为什么不能整除是最小循环节为它本身。
\(①\)如果\(n\)是\((n - p [ n ])\)的倍数,我们可以把字符串分为若干段长\((n - p [ n ])\)的字符串。首先我们把每段记为\(A、B、C、D\)(假设只有四段),所以\(D\)段表示的是字符串\(S[ p[ n ],n ]\)这一段,而由\(P\)数组的定义我们可知\(p[ n ]\)表示的\(n\)的最长公共前后缀,即\(S[ 1 ...p[ n ] ]\)前缀和\(S[ p[ n ] ...n ]\)后缀相同,所以我们有\(ABC=BCD\)(表示字符串依次连接),由于它们完全相等,所以\(A=B,B=C,C=D\),所以可知\(A\)就是循环节,而很容易由反证法知道不存在更短的循环节,否则和\(p\)数组定义不符。其数目即为答案。
\(②\)我们需要解决为什么不整除时就最小循环节就是它本身。我们运用反证法,假设存在最小循环节长\(len(len!=n)\),那么\(S[ 1,len ]=S[ n-len,n ]\),那么\(len=n - p[n]\),而由假设知,\(n\)不被\(n - p [ n ]\)整除,但又由循环节定义知\(n\)被\(len\)整除,因此矛盾。
代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int pre[MAXN];
char s[MAXN];
int main()
{
while(~scanf(" %s",s+1))
{
int n=strlen(s+1);
if(s[1]=='.')break ;
int j=0;pre[1]=0;
for(int i=1;i<n;i++)
{
while(j>0&&s[i+1]!=s[j+1])j=pre[j];
if(s[i+1]==s[j+1])j++;
pre[i+1]=j;
}
if(n%(n-pre[n])==0)printf("%d\n",n/(n-pre[n]));
else printf("1\n");
}
return 0;
}
原文地址:https://www.cnblogs.com/fangbozhen/p/11788177.html
- Python标准库01 正则表达式 (re包)
- 剑指OFFER之栈的压入、弹出序列(九度OJ1366)
- Python标准库03 路径与文件 (os.path包, glob包)
- AI人工智能时代已经到来 “北斗即时判”实现纯语音交互
- 剑指OFFER之链表中倒数第k个节点(九度OJ1517)
- 用Qt写软件系列四:定制个性化系统托盘菜单
- Linux简介与厂商版本
- 用Qt写软件系列三:一个简单的系统工具之界面美化
- VS编译链接时错误(Error Link2005)的解决方法
- HttpClient使用心得
- 剑指OFFER之重建二叉树(九度OJ1385)
- 记录visual Studio使用过程中的两个问题
- 剑指OFFER之二维数组中的查找(九度OJ1384)
- Python标准库02 时间与日期 (time, datetime包)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux服务器基础网络配置
- 负载均衡集群介绍,LVS介绍,LVS的调度算法,LVS的NAT模式搭建
- 03 实战 Ansible-Playbook之初始化服务器
- Dubbo与Zookeeper,SpringMVC整合和使用
- Docker安全之用户资源隔离
- kubernetes(六) 基于kubeadm构建高可用k8s集群
- docker存储驱动知识归纳总结
- 未来已来——如何在VR游戏中实现3D语音
- kubernetes(五)之Dockerfile
- kubernetes(四)之Docker存储卷
- 使用卷积神经网络构建图像分类模型检测肺炎
- 如何提升docker容器安全性
- CICD(三)Ansible常用模块以及案例
- 深入SVM:支持向量机核的作用是什么
- kubernetes(三)之Docker网络详解