POJ1961Period(kmp+循环节)
2024-09-06 09:02:13
题目大意:输出字符串所有前缀的循环节个数,下标从1开始,i 和1-i循环节的个数
题解:网上摘得
KMP最小循环节、循环周期:
定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。
(1)如果len可以被len - next[len]整除,则表明字符串S可以完全由循环节循环组成,循环周期T=len/L。
(2)如果不能,说明还需要再添加几个字母才能补全。需要补的个数是循环个数L-len%L=L-(len-L)%L=L-next[len]%L,L=len-next[len]。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000009
using namespace std; int n,len; char s[N]; int nxt[N]; void getnext()
{
memset(nxt,,sizeof(nxt));
for(int i=,j=;i<=len;i++)
{
while(s[i]!=s[j+]&&j) j=nxt[j];
if(s[i]==s[j+]) nxt[i]=++j;
}
} int main()
{
while()
{
scanf("%d",&len);
if(!len) break;
scanf("%s",s+);
getnext();
cout<<"Test case #"<<++n<<endl;
for(int i=;i<=len;i++)
{
int k=i-nxt[i];
if(i!=k&&i%k==)
printf("%d %d\n",i,i/k);
}
printf("\n");
}
return ;
}
最新文章
- .net请求URL过长,解决方案
- org.artofsolving.jodconverter.office.OfficeException: failed to start and connect
- HTML 5 <;script>; 标签
- Web Api中的get传值和post传值
- WPF之依赖属性
- 一个不简单的Procedure body例子
- Lazy Makes Others Busy – a bad experience with DLL
- zoj 3761
- HDU 5046 Airport ( Dancing Links 反复覆盖 )
- 推荐一个第三方Qt库的集合
- tasklet和workqueue的选择
- MySQL创建表的语句
- Linux DHCP原理
- JAVA_SE基础——14.循环结构语句
- Compass 更智能的搜索引擎(1)--入门
- Win10系列:C#应用控件进阶7
- 浏览器iscroll
- python2入门(2)
- 设计一款相册APP,代替系统自带的相册功能,列举主要功能
- [No0000188][VCB-Studio 科普教程 2.5] 基于 PotPlayer 和 madVR 的播放器教程(已更新 XySubFilter)
热门文章
- springboot传值踩坑
- Mysql 事务及其原理
- jQuery - 拦截所有Ajax请求(统一处理超时、返回结果、错误状态码 )
- python将字符串插入表中避免单双引号问题
- 《Web Development with Go》Middleware之使用gorilla.handlers
- P3747 [六省联考2017]相逢是问候
- CMKAE简单实用指南
- vue介绍以及相关概念理解大全
- 【Linux命令】setfacl、getfacl命令基本用法(文件权限全文控制列表acl)
- c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)