FZU - 1901 Period II(kmp所有循环节)】的更多相关文章

题目链接:http://acm.fzu.edu.cn/problem.php?pid=1901 题目大意:题目大意求出所有p满足s[i]=s[i+p](i<=len-p) 解题思路: 其实就是要找出所有的循环节(不只是最小的),循环节本质跟公共前后缀有关,可以通过递归的方法求出所有公共前后缀ti,那么len-ti就是相应循环节. 之前写的计算最小循环节,累加循环节得到前缀的方法是有问题的,过不了下面这种数据.数据:abacaba结果应该是4,6,7而求出来的是4,7.因为忽略了除了最小循环节外的…
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…
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 representin…
题目链接: Problem 1901 Period II 题目描述: 给出一个串,满足长度为p的前缀和长度为p的后缀相等的p的个数,输出p的个数,和p分别是多少? 解题思路: 对kmp的next数组的理解程度,next[i] = j的时候,就是当子串匹配到i的时候失配,就回溯到j的位置从新匹配,(s[0, j] == s[i-j, i]) 对于next[len] = x, s[0, x] == s[len-x, len]. next[x] = y, s[0, y] == s[x - y, x];…
传送门:FZU - 1901 题意:给你个字符串,让你求有多少个p可以使S[i]==S[i+P] (0<=i<len-p-1). 题解:这个题是真的坑,一开始怎么都觉得自己不可能错,然后看了别人的博客打脸了,发现自己掉坑了了...一开始想的是找出最小循环节,只要每次输出多加一个循环节,最后输出len就好了.后来发现最小循环节的倍数并不能表示所有循环节.看到的一组例子ababaaaabab,应该输出7,9,11:但是最小循环节的输出是7,11. 1 #include<iostream>…
思路: 这里只要注意一点,就是失配值和前后缀匹配值的区别,不懂的可以看看这里,这题因为对子串也要判定,所以用前后缀匹配值,其他的按照最小循环节做 代码: #include<iostream> #include<algorithm> const int N = 1000000+5; const int INF = 0x3f3f3f3f; using namespace std; int fail[N]; char p[N]; void getFail(){ fail[0] = -1;…
题意:给你一串字符串,问你前后缀相同情况有几种,并输出后缀位置(?这里一直没看懂length是什么,但是这样理解答案也对,然后还要加上本身长度) 思路:这里好好讲讲next的用法.我们都知道next代表前后缀匹配值,现在我们以下面这个字符串为例,讲述next的用法: len = 9,next[len] = 4,所我们找到了第一个前后缀匹配串abab,next[ next[len] ] = next[4] = 2,所以第二个前后缀匹配串长度为2.因为next[len] = 4,所以s[0...3]…
<题目链接> 题目大意: 给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. [>>>kmp next函数 kmp的周期问题]  #include <cstdio> #include <cstring> + ; char s[maxn]; int Next[maxn]; void get_next() { , k = -; Next[] = -; while (s[j]) { || s[j] == s[k]) Next[++j] =…
题目链接:https://vjudge.net/problem/FZU-1901  Problem 1901 Period II Accept: 575    Submit: 1495Time 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..SIZE(S)-p-…
<题目链接> 题目大意: 意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”) 的两次组成,也就是aa有两个a组成: 第三行自然就是aabaab可有两个aab组成: 第四行aabaabaab可由三个aab组成: 第五行aabaabaabaab可有四个aab组成 解题分析: 求字符串的前缀是否为周期串,若是,打印循环节的长度及循环次数: #include <cstdio> #include <cstring> ; char s[M]; int nxt[…