[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. 合并dict、list的方法

    dict1={1:[1,11,111],2:[2,22,222]}dict2={3:[3,33,333],4:[4,44,444]}合并两个字典得到类似 {1:[1,11,111],2:[2,22,2 ...

  2. Unity之fragment shader中如何获得视口空间中的坐标

    2种方法: 1. 使用 VPOS 或 WPOS语义,如: Shader "Test/ScreenPos1" { SubShader { Pass { CGPROGRAM #prag ...

  3. 水题 O

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

  4. E. Gerald and Giant Chess

    E. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes2015-09-0 ...

  5. Fantasia (点强连通分量建图 + 树形DP)

    简化一下题意,我们先看成一副强连通的图,这时候应该是最简单了,去点任意点都是其他的乘积.那再加强一点难度,改为两个强连通图连接的非强连通图呢?那应该就是找出关键的那个点,并求出两边的乘积.但是一个一个 ...

  6. Azure IoT 技术研究系列2-设备注册到Azure IoT Hub

    上篇博文中,我们主要介绍了Azure IoT Hub的基本概念.架构.特性: Azure IoT 技术研究系列1-入门篇 本文中,我们继续深入研究,做一个起步示例程序:模拟设备注册到Azure IoT ...

  7. C/C++笔试题(编程题)

    面试过程中遇到的编程题整理,于此备录.分享,共勉.(持续更新中......欢迎补充) (1)用户输入M, N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序. 程序代码如下: ...

  8. CS229 - MachineLearning - 12 强化学习笔记

    Ng的机器学习课,课程资源:cs229-课件    网易公开课-视频 问题数学模型: 马尔科夫过程五元组{S.a.Psa.γ.R},分别对应 {状态.行为.状态s下做出a行为的概率.常数.回报}. 一 ...

  9. gene Ontology (基因本体论)

    gene ontology为了查找某个研究领域的相关信息,生物学家往往要花费大量的时间,更糟糕的是,不同的生物学数据库可能会使用不同的术语,好比是一些方言一样,这让信息查找更加麻烦,尤其是使得机器查找 ...

  10. linux安装部署Nginx

    两个参考地址: NGINX的百度百科:https://baike.baidu.com/item/nginx/3817705?fr=aladdin NGINX的中文网站:http://www.nginx ...