Period

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12428    Accepted Submission(s): 5825

Problem Description
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 AK , that is A concatenated K times, for some string A. Of course, we also want to know the period K.
 
Input
The input file consists of several 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. The input file ends with a line, having the number zero on it.
 
Output
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.
 
Sample Input
3
aaa
12
aabaabaabaab
0
 
Sample Output
Test case #1
2 2
3 3

Test case #2
2 2
6 2
9 3
12 4

 
Recommend
JGShining   |   We have carefully selected several similar problems for you:  1686 3336 3746 3068 2203 
 
题目大意:
给一个字符串,从第二个字符开始,让你判断前面字符串是否具有周期性,然后输出此位置和最大周期数。(周期要大于一)
 
思路:
先构造出 next[] 数组,下标为 i,定义一个变量 j = i - next[i] 就是next数组下标和下标对应值的差,如果这个差能整除下标 i,即 i%j==0 ,则说明下标i之前的字符串(周期性字符串长度为 i)一定可以由一个前缀周期性的表示出来,这个前缀的长度为刚才求得的那个差,即 j,则这个前缀出现的次数为 i/j 。所以最后输出i和i/j即可。
 
code:
 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<memory>
using namespace std;
char wenben[];
int next1[];
void getnext1(char* s,int* next1,int m)
{
next1[]=;
next1[]=;
for(int i=;i<m;i++)
{
int j=next1[i];
while(j&&s[i]!=s[j])
j=next1[j];
if(s[i]==s[j])
next1[i+]=j+;
else
next1[i+]=;
}
}
int main()
{
int L;
int t=;
while(~scanf("%d",&L))
{
if(L==)
break;
scanf("%s",wenben);
getnext1(wenben,next1,L);
for(int i=;i<L;i++)
printf("i=%d->%d ",i,next1[i]);
printf("\n");
printf("Test case #%d\n",t++);
for(int i=;i<=L;i++)
{
int k=i-(next1[i]);
if(k!=i&&(i)%k==)
printf("%d %d\n",i,i/k);
}
printf("\n");
}
return ;
}

最新文章

  1. Android Stdio 调试Smali
  2. bootstrap学习笔记--bootstrap布局方式
  3. Akka-remote使用入门
  4. Kafka设计解析(三)- Kafka High Availability (下)
  5. My Game --简介
  6. javaSwing文本框组件
  7. android下基本json串的生成与解析
  8. char *s = getpass()屏幕不回显示 ,返回输入的字符
  9. Oracle和MSSQL查询有多少张表
  10. 收集 数据库的awr数据,生成报告
  11. 几种常用单片机I/O口线的驱动能力
  12. android studio依赖库工程Activity显示问题及库工程设置
  13. 3.XML的格式化显示
  14. [转]svn diff 替代工具
  15. C++ 二分法求解方程的解
  16. asp.net core系列 45 Web应用 模型绑定和验证
  17. App跟web定位元素页面相互切换
  18. kaggle learn python
  19. 【机器学习】异常检测算法(I)
  20. 如何从本地远程访问虚拟机内的Mysql服务器?

热门文章

  1. 《JavaWeb从入门到改行》fileupload,没毛病
  2. Class.forName(&quot;com.mysql.jdbc.Driver&quot;)找不到类
  3. javascript函数中with的介绍
  4. JS 处理浮点型问题
  5. 01.css选择器--&gt;类选择器
  6. JavaScript的进阶之路(五)理解数组2
  7. 使用nodeJs安装Vue-cli (win10 使用管理员身份)
  8. 使用WICleanup清理Windows Installer 冗余文件
  9. 引入 Tinker 之后如何在 Debug 模式下开启 Instant Run
  10. MyBatis基本配置和实践(四)