FZU 1901 Period II

Problem Description

For each prefix with length P of a given string S,if

S[i]=S[i+P] for i in [0..SIZE(S)-p-1],

then the prefix is a “period” of S. We want to all the periodic prefixs.

Input

Input contains multiple cases.

The first line contains an integer T representing the number of cases. Then following T cases.

Each test case contains a string S (1 <= SIZE(S) <= 1000000),represents the title.S consists of lowercase ,uppercase letter.

Output

For each test case, first output one line containing "Case #x: y", where x is the case number (starting from 1) and y is the number of periodic prefixs.Then output the lengths of the periodic prefixs in ascending order.

Sample Input

4 ooo acmacmacmacmacma fzufzufzuf stostootssto

Sample Output

Case #1: 3 1 2 3 Case #2: 6 3 6 9 12 15 16 Case #3: 4 3 6 9 10 Case #4: 2 9 12

•题意:给你一个字符串str,对于每个str长度为p的前缀,如果str[i]==str[p+i](p+i<len),那么我们认为它是一个periodic prefixs.求所有满足题意的前缀的长度p。

•知识点:KMP算法、对next数组的理解

•KMP算法中next数组的含义是什么?

•next数组:失配指针

•如果目标串的当前字符i在匹配到模式串的第j个字符时失配,那么我们可以让i试着去匹配next(j)

•对于模式串str,next数组的意义就是:

•如果next(j)=t,那么str[1…t]=str[len-t+1…len]

•我们考虑next(len),令t=next(len);

•next(len)有什么含义?

•str[1…t]=str[len-t+1…len]

•那么,长度为len-next(len)的前缀显然是符合题意的。

•接下来我们应该去考虑谁?

•t=next( next(len) );

•t=next( next (next(len) ) );

• 一直下去直到t=0,每个符合题意的前缀长是len-t

 1 #include <cstdio>
 2 #include <cstring>
 3 const int maxn = 1000010;
 4 int p[maxn],ans[maxn];
 5 char str[maxn];
 6
 7 void get_p(int len){
 8     p[1] = 0;
 9     int j = 0;
10     for(int i = 2;i <= len;i++){
11         while(j > 0 && str[j+1] != str[i])
12             j = p[j];
13         if(str[j+1] == str[i])
14             j++;
15         p[i] = j;
16     }
17 }
18
19 int main(){
20     int nkase;
21     scanf("%d",&nkase);
22     for(int kase = 1;kase <= nkase;kase++){
23         scanf("%s",str+1);
24         int len = strlen(str+1);
25         get_p(len);
26         int t = p[len],cnt = 0;
27         while(t){
28             ans[cnt++] = len-t;
29             t = p[t];
30         }
31         ans[cnt++] = len;
32         printf("Case #%d: %d\n",kase,cnt);
33         for(int i = 0;i < cnt-1;i++)
34             printf("%d ",ans[i]);
35         printf("%d\n",ans[cnt-1]);
36     }
37     return 0;
38 }                    

FZU 1901 Period II

时间: 2024-10-09 07:22:42

FZU 1901 Period II的相关文章

FZU - 1901 Period II (kmp)

传送门:FZU - 1901 题意:给你个字符串,让你求有多少个p可以使S[i]==S[i+P] (0<=i<len-p-1). 题解:这个题是真的坑,一开始怎么都觉得自己不可能错,然后看了别人的博客打脸了,发现自己掉坑了了...一开始想的是找出最小循环节,只要每次输出多加一个循环节,最后输出len就好了.后来发现最小循环节的倍数并不能表示所有循环节.看到的一组例子ababaaaabab,应该输出7,9,11:但是最小循环节的输出是7,11. 1 #include<iostream>

FZU 1901

#include <iostream>#include <cstring> 考查了对next数组的了解 using namespace std;#define max 1000005int next[max],l,ans[max];char s[max];void getNext(){    int j,k;    next[0]=-1;    j=0;k=-1;    while(j<l){if(k==-1||s[j]==s[k])    {            j++;

Q - Period II

For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the prefix is a "period" of S. We want to all the periodic prefixs. Input Input contains multiple cases. The first line contains an integer T repres

第二周 9.6-9.12

9.6 FZU 1901 Period II 并不需要完整的周期.即最后一段可以不完整. 所以直接沿Next往后找就可以了. 行末不能有空格不然PE. 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <vector> 5 using namespace std; 6 int m,Next[1000100]; 7 char b[1000100]; 8 9

fzu1901Period II

地址:http://acm.fzu.edu.cn/problem.php?pid=1901 题目: Problem 1901 Period II Accept: 442    Submit: 1099Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SI

KMP 总结

再次回来总结KMP,发现有点力不从心,学久了,越觉得越来越不理解了. 估计是写KMP已经不下50遍了吧.每次用都是直接默写.. KMP算法,串模式匹配算法,通过预处理得到next数组,再进行匹配. 几个要重点记忆的地方: 1. next数组的含义 next[i] = t 表示以i位置结尾的前缀串(相对于原串是前缀串)的真前缀和真后缀相等的最大值为t 2. 最小覆盖子串: 我不会证明,但是记得住结论,记len表示字符串的长度,则这个字符串的最小覆盖子串为 len - next[len] 3. KM

KMP模板及总结

KMP是一种字符串匹配算法,它在时间复杂度上较暴力匹配算法由很大的优势.比如我要找字符串S中是否存在子串P,如果暴力匹配的话,则时间复杂度为O(n*m),而kmp算法时间复杂度为O(n+m). 这里我们有一个辅助的数组next[](先别管怎么求出来的),next[i]含义是模式串P中[0....i-1]这一段的长度小于这段字符串的长度的最长公共前缀(比如ababa,公共前缀就是aba). 好,那我们接下来讲一下kmp算法的具体操作: 假设,我们开始有字符串S:ababaaba   模式串P:ab

FZU Problem 2171 防守阵地 II (线段树,区间更新)

 Problem 2171 防守阵地 II Accept: 143    Submit: 565Time Limit: 3000 mSec    Memory Limit : 32768 KB  Problem Description 部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵的能力之和.随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,每个参加完防守

fzu 2171 防守阵地 II

首先想说的是PPT设计,现在还是有很多人只把PPT当成一个存放文字和图片的软件,说的更直接点就是当是一个可以全屏放映内容的软件.但是我想说的是PPT已经走向了设计类型的软件,当Microsoft office Powerpoint2010正式版出来的时候这种感觉更盛了.绚丽的动画和更强大的设计功能,相信微软也是以设计软件这一理念来做更深层的突破了吧.技术的不断突破也给增加了PPT设计的范围,不再是单调的报告,而开始走向了企业宣传,产品宣传,动画制作--专业的设计也不断的接合平面设计,动画设计,甚