HDU 1358 Period(kmp简单解决)

Period

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

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

题目大意:一个字符串,问从头到某个位置,字符串的前缀最多重复了多少次。比方aaaa的字符串,到第二个字符,前缀a重复了两次,到第三个字符,前缀a重复了三次,到第四个字符,前缀a重复了四次,前缀aa重复了两次,但我们要得到的是重复了四次。

解题思路:考察KMP算法中的p数组。p数组是基本的,然后,在p数组中考察,p[6]=4,我们能知道的是,s[1]=s[3]=s[5],s[2]=s[4]=s[6],其实只要在p[k]=u时,当u整除(k-u)的时候,就是满足题目要求的时候。

AC代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 1000000
 4
 5 int n;
 6 char str[N];
 7 int p[N];
 8
 9 void run(void)
10 {
11     memset(p,-1,sizeof(p));
12     for(int i=1;i<n;i++)
13     {
14         int k=p[i-1];
15         while(1)
16         {
17             if(str[k+1]==str[i])
18             {
19                 p[i]=k+1;
20                 if((i+1)%(i-p[i])==0)
21                     printf("%d %d\n",i+1,(i+1)/(i-p[i]));
22                 break;
23             }
24             if(k==-1)break;
25             k=p[k];
26         }
27     }
28 }
29
30 int main()
31 {
32     int id=0;
33     while(scanf("%d",&n)==1&&n)
34     {
35         getchar();
36         gets(str);
37         printf("Test case #%d\n",++id);
38         run();
39         puts("");
40     }
41 }
时间: 2024-10-18 16:35:49

HDU 1358 Period(kmp简单解决)的相关文章

Hdu 1358 Period (KMP 求最小循环节)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目描述: 给出一个字符串S,输出S的前缀能表达成Ak的所有情况,每种情况输出前缀的结束位置和k. 解题思路: 打表算出next数组,然后对位置i求循环节,如果满足 i % (i - Next[i]) == 0 && Next[i] != 0,所对应的循环节(i - Next[i]), 循环次数是i / (i - Next[i]) 1 #include<cstdio> 2

hdu 1358 period KMP入门

Period 题意:一个长为N (2 <= N <= 1 000 000) 的字符串,问前缀串长度为k(k > 1)是否是一个周期串,即k = A...A;若是则按k从小到大的顺序输出k即周期数: 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 题目其实是来自于LA的..挺好的一道题,用的是原版的kmp.. 写写对KMP

HDU 1358 Period KMP

题意:求一个字符串的所有前缀是否是复制出来的. 解题思路:next 数值判断即可 解题代码: 1 // File Name: getnext.cpp 2 // Author: darkdream 3 // Created Time: 2014年09月09日 星期二 22时35分02秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<dequ

poj1961 &amp; hdu 1358 Period(KMP)

poj 题目链接:http://poj.org/problem?id=1961 hdu题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 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

KMP + 求最小循环节 --- HDU 1358 Period

Period Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1358 Mean: 给你一个字符串,让你从第二个字符开始判断当前长度的字符串是否是重复串,如果是,输出当前位置,并输出重复串的周期. analyse: 还是next数组的运用,详见上一篇博客. Time complexity: O(N) Source code:  /** this code is made by crazyacking* Verdict: Acce

(KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)

题目: Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3813    Accepted Submission(s): 1862 Problem Description For each prefix of a given string S with N characters (each character has an A

Period (poj 1961&amp;&amp;hdu 1358)KMP

Language: Default Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 13504   Accepted: 6365 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 t

HDU - 1358 - Period (KMP)

Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4325    Accepted Submission(s): 2087 Problem Description For each prefix of a given string S with N characters (each character has an ASCI

HDU 1358 Period 求前缀长度和出现次数(KMP的next数组的使用)

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 ASCI