[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. c#中枚举类型的定义与使用

    介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.定义默认基数从O开 ...

  2. JavaScript 创建和浅析自定义对象

    在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式:对象直接量.new 构造函数.Objec ...

  3. PHP 中最全的设计模式(23种)

    https://my.oschina.net/botkenni/blog/1603660 PHP 中最全的设计模式(23种) 原 botkenni 发布于 01/07 21:22 字数 8726 阅读 ...

  4. Mysql 修改字段长度、修改列名、新增列、修改自增主键起始值

    alter table 表名 modify column 字段名 类型; 例如 数据库中user表 name字段是varchar(30) 可以用 ) ; --修改字段长度 )--修改表列名 ); -- ...

  5. aic bic mdl

    https://blog.csdn.net/xianlingmao/article/details/7891277 https://blog.csdn.net/lfdanding/article/de ...

  6. hdu5439 二分

    题意 初始给了 1 2 两个数 第二步 因为第2个数是2 所以  在序列后面放上2个2 包括他自己之前有的 序列变成 1 2 2 第三步 因为第3个数是2 所以  在序列后面放上2个3 就变成了 1 ...

  7. linux基础操作

    1.pwd 2.clear 3.who 4.cal 5.uname 6.wc 7.man在线帮助命令 8.--help.info.whatis 9.使用su命令以root身份进入linux 10.Sh ...

  8. RabbitMQ生产者消费者

    package com.ra.car.rabbitMQ; import java.io.IOException; import java.util.HashMap; import java.util. ...

  9. 如何删除自己上传的CSDN资源(亲测有效)

    今天发现有一个资源上传错了,想重新上传,删掉以前的资源,才发现CSDN并没有提供删除资源的功能,然后去网上搜了下,这才删除了,不知道怎么删除的小伙伴看过来~ 1.首先,找到自己想要删除资源的页面,举个 ...

  10. android使用ARouter跳转activity(阿里巴巴开源的)

    android使用ARouter跳转activity(阿里巴巴开源的) 使用ARouter方式,点击按钮跳转到其他activitypublic void buyOrSell(String str){ ...