poj1961 kmp】的更多相关文章

POJ1961 问题重述: 输入一个长度为l的字符串S,求所有S的由字串重复排列而成的前缀,并输出前缀的长度以及该前缀的最大重复度. AC代码: //Memory: 5700K Time: 641MS #include <iostream> #include <cstring> #include <string> using namespace std; ; int prefix[maxn]; string s; void init() { int l = s.size…
Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 16776   Accepted: 8077 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…
题目大意,求这个字符串到i为止有多少个循环串: int k = i-next[i]; if((i+1)%k == 0 && (i+1)!= k) printf("%d %d\n", i+1, (i+1)/k); 这是代码的主要部分,求next数组的部分大家都知道,我来说说这部分的正确性: 例如一个字符串的第99为指向第96位,也就是说后4-99位和前1-96位是匹配的,就是说94到96与97到99是是匹配的: 而且91-94与94-96是匹配的........... 一…
/** 题目:poj1961 Period 链接:http://poj.org/problem?id=1961 题意:求从1到i这个前缀(2<=i<=N) ,如果有循环节(不能自身单独一个),输出前缀字符串长度以及最大的循环周期: 思路: 参考自:http://www.cnblogs.com/chenxiwenruo/p/3546457.html 定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]. (1)…
翻阅了一下网上资料,发现大部分都说这题是找规律...或是说YY出的一个算法..不会证明... 然后就脑补了一下证明 ~ 结论:对于一个字符串S[1..N],如果N mod (N-next[N])=0 则存在循环并且长度为N-next[N]的循环. 脑补的证明:       首先必要性很显然,如果N mod (N-next[N])<>0显然不存在循环.                    如图红色区域为N-next[N]长度的字符串.根据KMP造出的next数据的性质,S[1..next[n]…
题目链接:https://vjudge.net/problem/POJ-1961 题意:给定一个长为n的字符串(n<=1e6),对于下标i(2<=i<=n),如果子串s(1...i)是周期子串,输出其最大周期. 思路: 考察对kmp算法中next数组的定义掌握,如果(i+1)%(i-j)==0 && (i+1)/(i-j) > 1,那么该子串即为满足条件. AC代码: #include<cstdio> #include<algorithm>…
题意 求字符串s的最小循环元长度和循环次数 思路 s[1~i]满足循环元要len能整除i并且s[len+1~i]=s[1~i-len] 代码 #include<cstdio> #include<algorithm> #include<cstring> #define N 1000005 using namespace std; char s[N]; int next[N]; int n,T; int len; void kmp() { next[]=; ,j=;i<…
Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 20436   Accepted: 9961 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…
题面 一个字符串的前缀是从第一个字符开始的连续若干个字符,例如"abaab"共有5个前缀,分别是a, ab, aba, abaa, abaab. 我们希望知道一个N位字符串S的前缀是否具有循环节.换言之,对于每一个从头开始的长度为 i (i 大于1)的前缀,是否由重复出现的子串A组成,即 AAA...A (A重复出现K次,K 大于 1).如果存在,请找出最短的循环节对应的K值(也就是这个前缀串的所有可能重复节中,最大的K值). 算法 我们看到这个前缀 自然想到了KMP中的next数组(…
引理:\(s[1,i]\) 具有长度为 \(len\) 的循环节的充要条件是:\(len\ |\ i,s[1,i-len]=s[len+1,i]\). 代码如下 #include <cstdio> #include <cstring> using namespace std; const int maxn=1e6+10; char s[maxn]; int n,kase,fail[maxn]; void get_fail(){ fail[1]=0; for(int i=2,j=0;…