[POJ1961]period

题目描述

如果一个字符串S是由一个字符串T重复K次构成的,则称T是S的循环元。使K出现最大的字符串T称为S的最小循环元,此时的K称为最大循环次数。
现在给定一个长度为N的字符串S,对S的每一个前缀S[1~i],如果它的最大循环次数大于1,则输出该循环的最小循环元长度和最大循环次数。

输入

多组数据,每个数据包括两行。第一行为字符串大小N,第二行包括字符串。输入最后一行以0结尾。

输出

第一行"Test case #"+测试数据第几组,对于每个周期K>1,长度为i的前缀,输出前缀大小i和由单个空格分隔的周期K;前缀必须按照递增排列,每个测试数据之后输出一个空行。

题解思路

  • 与自己的前缀进行匹配,与KMP中的next数组的定义相同。next数组的定义是:字符串中以i结尾的子串与该字符串的前缀能匹配的最长长度。
  • 将字符串S与自身进行匹配 ,对于每个前缀,能匹配的条件即是:S[i-next[i]+1~i]与S[1~next[i]]是相等的,并且不存在更大的next满足条件。
  • 当i-next[i]能整除i时,S[1~i-next[i]]就是S[1~i]的最小循环元。它的最大循环次数就是i/(i - next[i])。
        //#include<bits/stdc++.h>
#include<string>
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e6+;
char s[maxn];
int next[maxn],n,T;
void cal(){
next[] = ;
for(int i = ,j = ;i <= n; ++i){
while(j> && s[i] != s[j+]) j = next[j];
if(s[i] == s[j+]) j++;
next[i] = j;
}
}
int main(){
while(cin >> n && n){
// memset(next,0,sizeof(next));
scanf("%s",s+);
cal();
printf("Test case #%d\n",++T);
for(int i = ;i <= n; i++){
if(i%(i-next[i])== && i/(i-next[i]) > )
printf("%d %d\n",i , i/(i-next[i]));
}
puts("");
}
// return 0;
} 

【POJ1961】period的更多相关文章

  1. 【题解】PERIOD - Period [POJ1961] [SP263]

    [题解]PERIOD - Period [POJ1961] [SP263] 在进入这道题之前,我们需要了解 kmp 算法 不知道的童鞋可以去看一下Silent_EAG(一个可爱的女孩纸)的讲解. 关于 ...

  2. 【KMP】Period

    KMP算法 Next[]函数深入理解,Next[]当前字符前匹配字符数,串长n-Next[i]=串内循环子串的长度p. 本题求子循环串内循环节数. Problem Description For ea ...

  3. 【UVA1371】Period (二分+DP)

    题意: 给出两个字符串A,B将B分解成若干个子字符串,然后每个子字符串都要经过编辑变成字符串A,所有子串中编辑最多的次数即为当前状态下的最大编辑次数,要求求最小的最大编辑次数. 编辑操作包括修改.删除 ...

  4. 【POJ1961】最短周期串/最大周期 kmp

    引理:\(s[1,i]\) 具有长度为 \(len\) 的循环节的充要条件是:\(len\ |\ i,s[1,i-len]=s[len+1,i]\). 代码如下 #include <cstdio ...

  5. KMP【UVA1328】 Period

    Description 如果一个字符串S是由一个字符串T重复K次形成的,则称T是S的循环节.使K最大的字符串T称为S的最小循环节,此时的K称为最大循环次数. 现给一个给定长度为N的字符串S,对S的每一 ...

  6. 【POJ 1961】 Period

    [题目链接] 点击打开链接 [算法] KMP 和POJ2406很像 [代码] #include <algorithm> #include <bitset> #include & ...

  7. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  8. 【转】ACM训练计划

    [转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...

  9. 【锁】Oracle锁系列

    [锁]Oracle锁系列 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ...

随机推荐

  1. Unity shader学习之高光反射光照模型

    高光反射光照模型的公式如下: Cspecular = Clight * mspecular * max(0, dot(v, r))gloss 要计算高光反射需要知道4个参数:入射光线颜色Cspecul ...

  2. report源码分析——report_object和report_message

    uvm的report机制,主要涉及uvm_report_object,uvm_report_handle,uvm_report_server这三个类: uvm_report_object主要是提供uv ...

  3. 水题 O

    Bob 和 Alice 开始使用一种全新的编码系统.它是一种基于一组私有钥匙的.他们选择了n个不同的数a1 , . . .,an, 它们都大于0小于等于n. 机密过程如下:待加密的信息放置在这组加密钥 ...

  4. Yii Restful api自定义字段

  5. uvalive 3887 Slim Span

    题意: 一棵生成树的苗条度被定义为最长边与最小边的差. 给出一个图,求其中生成树的最小苗条度. 思路: 最开始想用二分,始终想不到二分终止的条件,所以尝试暴力枚举最小边的长度,然后就AC了. 粗略估计 ...

  6. 20155228 2016-2017-2 《Java程序设计》第1周学习总结

    20155228 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 这部分内容是以教材为基础,根据个人的理解来描述的,有的地方的理解和表述可能不规范甚至不正确, ...

  7. Java基础整理

    一.Java中的遍历 1.在java开发中会碰到遍历List删除其中多个元素的情况,如果使用一般的for循环以及增强的for循环,代码会抛出异常ConcurrentModificationExcept ...

  8. Linux基础命令---ifconfig

    ifconfig ifconfig指令用来配置网络接口参数,同时还可以显示当前内核网络接口的工作状态.如果没有提供参数,则ifconfig将显示当前活动接口的状态.如果给定单个接口参数,则只显示给定接 ...

  9. RBAC

    什么是rbac? -- 基于角色的权限控制  Role-Based Access Control 一个url就代表一个权限 // url分配给角色,角色分配给用户 -- 6个model,4张表 菜单表 ...

  10. bzoj1625 [Usaco2007 Dec]宝石手镯

    01背包 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring& ...