洛谷 SP263 Period
洛谷 SP263 Period
题目描述
For each prefix of a given string *S* with *N* characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each *i* (2 <= *i* <= *N*) we want to know the largest *K* > 1 (if there is one) such that the prefix of *S* with length *i* can be written as *A* ^{K}*K* , that is *A* concatenated *K* times, for some string *A*. Of course, we also want to know the period *K*.
输入格式
The first line of the input file will contains only the number T (1 <= T <= 10) of the test cases.
Each test case consists of two lines. The first one contains *N* (2 <= *N* <= 1 000 000) – the size of the string *S*. The second line contains the string *S*.
输出格式
For each test case, output “Test case #” and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
题意翻译
如果一个字符串S是由一个字符串T重复K次形成的,则称T是S的循环元。使K最大的字符串T称为S的最小循环元,此时的K称为最大循环次数。
现给一个给定长度为N的字符串S,对S的每一个前缀S[1~i],如果它的最大循环次数大于1,则输出该前缀的最小循环元长度和最大循环次数。
感谢@super_kidding 提供的翻译
输入输出样例
输入 #1复制
输出 #1复制
一道KMP算法的练手好题。
大体的题目大意是这样的:
题目大意:
如果一个字符串S是由一个字符串T重复K次形成的,则称T是S的循环元。使K最大的字符串T称为S的最小循环元,此时的K称为最大循环次数。
现给一个给定长度为N的字符串S,对S的每一个前缀S[1~i],如果它的最大循环次数大于1,则输出该前缀的最小循环元长度和最大循环次数。
题解:
一道KMP算法的题目,如果对KMP算法还是没有什么深刻的理解或者还没学KMP算法的,请移步我的这篇博客,讲解还算详细:
一开始拿到题没什么思路(我还是太菜了)
后来发现,对给出的串\(S\)自匹配求出\(nxt\)数组之后,对于每一个\(i\),一定会有这么一个结论:
\]
这是通过KMP算法对\(nxt\)数组的定义得来的。
那么,既然这两个东西是相等的,那么在对这个子串进行匹配的时候,这个循环节长度就应该是\(i-nxt[i]\),然后循环次数当然就是\(i/(i-nxt[i])\),当然,前提需要是\(i\%(i-nxt[i])==0\)。
代码如下:
#include<cstdio>
using namespace std;
const int maxl=1e6+10;
int n,tot;
char s[maxl];
int nxt[maxl];
int main()
{
while(~scanf("%d",&n) && n)
{
scanf("%s",s+1);
tot++;
printf("Test case #%d\n",tot);
nxt[1]=0;
for(int i=2,j=0;i<=n;++i)
{
while(s[i]!=s[j+1] && j)
j=nxt[j];
if(s[i]==s[j+1])
j++;
nxt[i]=j;
if(nxt[i]!=0 && i%(i-nxt[i])==0)
printf("%d %d\n",i,i/(i-nxt[i]));
}
printf("\n");
}
return 0;
}
洛谷 SP263 Period的更多相关文章
- 洛谷 UVA1328 Period
洛谷 UVA1328 Period 洛谷传送门 题目描述 PDF 输入格式 无 输出格式 无 题意翻译 题意描述 对于给定字符串S的每个前缀,我们想知道它是否为周期串.也就还是说,它是否为某一字符串重 ...
- [POI2014] KUR-Couriers(洛谷P3567)
洛谷题目链接:[POI2014]KUR-Couriers 题目描述 Byteasar works for the BAJ company, which sells computer games. Th ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- 笔记||Python3之文件的读写
[文件的读模式] 文件的对象:文件的读写通过文件操作对象进行. Python2 ----- File Python3 ----- TextIOWrapper ...
- 002_Java语言基础
------------恢复内容开始------------ 存储的基本单元:byte: 1 byte = 8 bit(位) 1 KB = 1024 byte 1 MB = 1024 KB 1 GB ...
- LInux内核配置过程
内核版本 linux 2.6.32.2 配置内核的过程 配置内核可以通过执行 make menuconfig 来进行,下面分析该命令的执行流程 执行该目标 %config: scripts_basic ...
- 【hibernate】自定义转换器
[hibernate]自定义转换器 转载:https://www.cnblogs.com/yangchongxing/p/10398255.html 1.转换基本属性 package cn.ycx.s ...
- newifi 1.6.13上运行mentohust方案
newifi最新版的固件,已经无法简单的root和开启ssh了,以下是本人的解决方案. 一·刷上pandorabox系统 1.系统可以到联想NBD社区下载:http://www.newbandeng. ...
- CCF-CSP题解 201712-3 Crontab
做完一定要仔仔细细地看一遍题目再交,之后发现坑点只能追悔莫及.比如这次"英文缩写(不区分大小写)"\(OwQ\). 给定多个周期性执行的任务,每个任务调度执行有时间的要求.求给定时 ...
- 【搞定Jvm面试】 JDK监控和故障处理工具揭秘
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...
- 图文结合深入理解JS中的this值
文章目录 Js 中奇妙的this值 1. 初探this 2. this指向总结 2.1 普通函数调用 2.2 对象的方法调用 2.3 构造函数调用 2.4 利用call,apply,bind方法调用函 ...
- 微信小程序APP生命周期
小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...
- Racket 命令行方式安装 collection
最近在学习 SICP,里面用的 Lisp 系列的 Scheme.OS X 上要配置Scheme环境. Racket 完整的包要 110 M,mini 版只要10M.我只需要简单的命令行操作,显然选mi ...