HDU 1358 Period(KMP计算周期)
2024-10-21 11:51:47
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
题目大意:给你一串字符串,判断字符串的前缀是否由某些字符串多次重复而构成。
也就是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”)
的两次组成,也就是aa有两个a组成;
第三行自然就是aabaab可有两个aab组成;
第四行aabaabaab可由三个aab组成;
第五行aabaabaabaab可由四个aab组成。
解题思路:同HDU 3746类似,通过计算字符串前缀的循环节获得相应周期即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+; int m;
int nxt[N];
char p[N]; void getnext(){
int i,j;
i=,j=nxt[]=-;
while(i<m){
while(j!=-&&p[i]!=p[j])
j=nxt[j];
nxt[++i]=++j;
}
} int main(){
int cas=;
while(scanf("%d",&m)&&m){
scanf("%s",p);
getnext();
printf("Test case #%d\n",++cas);
//枚举长度为2~m的字符串前缀
for(int i=;i<=m;i++){
int mmin=i-nxt[i]; //len-nxt[len]为最小循环节
if(i!=mmin&&i%mmin==)
printf("%d %d\n",i,i/mmin);
}
printf("\n");
}
return ;
}
最新文章
- Gevent中的同步与异步详解
- Eclipse 关于“The type * is not accessible due to restriction on required library”问题的解决办法
- start with connect by prior 递归查询用法
- Entity Framework: Joining in memory data with DbSet
- 【Spring五】AOP之使用注解配置
- ORACLE 11G EXP导出空表方法
- Android解决异常apk on device &#39;0292bea1&#39;: Unable to open sync connection!
- javascript 复制数组
- js模块化世界
- MyEclipse2017 隐藏回车换行符
- Testing - 软件测试知识梳理 - 探索性测试
- Linux设备驱动剖析之IIC(三)
- bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵
- Java中IO的简单举例
- 【文文殿下】 [SDOI2016]生成魔咒
- Shell笔记-04
- 1.6 JAVA高并发之线程池
- idea 出现 java.noSuchMechodFound
- Java 之多线程通信(等待/唤醒)
- Object.prototype.hasOwnProperty()