ACM-数据结构-KMP
暗金色
这个作者很懒,什么都没留下…
展开
-
HDU - 2087 剪花布条(KMP)
题目大意:中文题意解题思路:KMP的裸题了,从左往右找,看有几个匹配的字符串就可以了#include <cstdio>#include <cstring>const int N = 1010;char a[N], b[N];int next[N];int lena, lenb;void getFail() { next[0] = -1; int i = 0, j = -1;原创 2015-10-26 22:29:21 · 820 阅读 · 0 评论 -
HDU - 2609 How many(最小表示法)
题目大意:给你N个字符串,这些字符串是可以滚动的。 问这N个字符串经过滚动后,最少有多少个字符串是不同的解题思路:求出每个字符串经过滚动后最小的字符串,然后排个序,去重就可以了#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>using namespace std;const int N =原创 2015-10-26 23:14:21 · 421 阅读 · 0 评论 -
HDU - 2594 Simpsons’ Hidden Talents(KMP)
题目大意:问你前缀和后缀相等的最长长度解题思路:KMP的裸题了,next数组的应用#include <cstdio>#include <cstring>const int N = 50010;char s1[N], s2[N];int len1, len2;int next[N];void getFail() { len1 = strlen(s1); len2 = strl原创 2015-10-26 22:53:09 · 333 阅读 · 0 评论 -
HDU - 4763 Theme Section(拓展kmp)
题目大意:给你一个字符串,要求你找出符合EAEBE的最长的E(E,A,B都是字符串)解题思路:E串的限制条件就是min(i, next[i], (len - i) / 2),找到最大的符合题意的长度限制 接着从字符串的2/3的后面开始找(因为E串的长度不能大于1/3,不然就覆盖了)找到i + next[i] == len,这种情况是满足的。但还得判断一下长度是不是超过了,因为我们前面已经判断了最长原创 2015-10-27 00:27:52 · 490 阅读 · 0 评论 -
HDU - 3068 最长回文(manacher)
题目大意:中文题 解题思路:manacher裸题了#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N = 220010;char s[N];int p[N];int len;void init() { len = strlen(s); for原创 2015-10-26 23:37:36 · 354 阅读 · 0 评论 -
HDU - 1686 Oulipo(KMP)
题目大意:给出两个字符串,问第一个字符串在第二个字符串中出现了几次解题思路:KMP的裸题了,如果匹配成功,就用next数组代替,然后继续匹配下去,这题考查的是对next数组的理解#include <cstdio>#include <cstring>const int N = 1000010;char a[N], b[N];int next[N];int lena, lenb;void ge原创 2015-10-26 22:25:49 · 423 阅读 · 0 评论 -
HDU - 3294 Girls' research(manacher)
题目大意:要求你求出一个字符串的最长回文子串,并将最长回文子串按要求经过转码输出解题思路:manacher的裸题#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 400010;char str[N], tmp[10];int p[N];int len;void原创 2015-10-26 23:36:33 · 420 阅读 · 0 评论 -
POJ - 2752 Seek the Name, Seek the Fame(KMP next数组的理解)
题目大意:给你一个字符串,问前缀和后缀相等的所有情况,输出相等时候的长度解题思路:这就是next数组的理解问题了,next[i]表示的是前i个字符串中前缀和后缀相等的最长长度。找到一个后,再依照上一个位置继续寻找,依此递推,就可以递归找出所有相等的#include <cstdio>#include <cstring>const int N = 400010;char str[N];int le原创 2015-10-26 22:50:34 · 269 阅读 · 0 评论 -
HDU - 1711 Number Sequence(KMP)
题目大意:给你两个串,问第二个串是否在第一个串出现过,如果出现,输出最早出现的位置解题思路:KMP裸题#include <cstdio>#include <cstring>const int N = 1000010;int a[N], b[N], next[N];int n, m;void init() { scanf("%d%d", &n, &m); for (int i原创 2015-10-26 22:22:54 · 344 阅读 · 0 评论 -
HDU - 4513 吉哥系列故事――完美队形II(manacher)
题目大意:中文题了解题思路:manacher的裸题,只要再加相等和大小判断就可以#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 200010;const int INF = 0x3f3f3f3f;int num[N], p[N];int n, len;void原创 2015-10-26 23:30:44 · 577 阅读 · 0 评论 -
POJ - 3974 Palindrome(manacher)
题目大意:问一个字符串的最大回文子串解题思路:manacher裸题了#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 2000010;char str[N];int p[N];int len, cas = 1;void init () { len = s原创 2015-10-26 23:29:27 · 377 阅读 · 0 评论 -
HDU - 3613 Best Reward(KMP和拓展KMP)
题目大意:给你26个字符对应的价值和一个字符串,要求你将字符串分成两个部分。分开后,如果那部分是回文的话,那么价值就是该部分字符的价值和,如果不是回文,价值为0,问分开后的最大价值和解题思路:可以用KMP做也可以用拓展KMP做KMP做的话,假设原字符串是s1,然后将字符串倒转变成s2,先求s1的后缀和s2的前缀匹配的部分,这部分是s1的后缀的回文部分,然后再通过next数组,找出所有的回文,并标记原创 2015-10-26 23:28:15 · 520 阅读 · 0 评论 -
FZU - 1901 Period II(KMP next数组的理解)
题目大意:给你一个字符串,问这个字符串前缀等于后缀的所有后缀的开始位置解题思路:就是next数组的理解了,出现的位置就是len - next[i]了#include <cstdio>#include <cstring>const int N = 1000010;char str[N];int next[N], ans[N];int len, cas = 1, cnt = 0;void get原创 2015-10-26 23:16:22 · 910 阅读 · 0 评论 -
HDU - 4300 Clairewd’s message(KMP)
题目大意:给你一个转码串和一个密码,密码由密文和明文构成,密文是完整的,明文有可能不完整。问需要添加多少个明文,才能使明文转码后和密文相同。最后要求输出添加了字符的串解题思路:刚开始是密文+明文的串,那么我转换一下,就变成了明文+密文的串了,又因为密文是完整的,所以转码后,只能取走后半部分 接着用原来的串和转码后的后半部分比一下,找出拥有的最长公共子串,那么两个公共串中间的字符,就是需要添加的字符原创 2015-10-26 23:05:59 · 363 阅读 · 0 评论 -
HDU - 1358 Period(KMP next数组)
题目大意:给你一个字符串,要求你找出所有的循环部分。找出循环部分指的是前i个字符都是由循环节构成,且至少要由两个循环节构成,并输出循环节出现的次数解题思路:next数组和循环节的概念了,理解了就会了#include <cstdio>#include <cstring>const int N = 1000010;int len;char str[N];int next[N];void get原创 2015-10-26 22:43:31 · 377 阅读 · 0 评论 -
HDU - 3746 Cyclic Nacklace(KMP 循环节)
题目大意:给你一个字符串,问需要添加多少个字符,才能使这个字符串变成一个至少由2个循环节组成的字符串解题思路:这题考查的是KMP和循环节的概念,在KMP中,循环节的长度就是len - next[len],len指字符串的长度 得知循环节的长度后,就可以判断该字符串是否已经符合了,也就是不用添加了 如果需要添加的话,添加的长度就是len - next[len] - len % (len - ne原创 2015-10-26 22:37:05 · 334 阅读 · 0 评论 -
HDU - 3374 String Problem(最小表示法和最大表示法)
题目大意:给你一个字符串,问这个字符串经过移动后的字典序最小的字符串的首字符位置和字典序最大的字符串的首字符的位置,和能出现多少次最小字典序的字符串和最大字典序的字符串解题思路:能出现多少次,就要看循环节有多少个了 剩下的就是最小表示法和最大表示法的裸题了#include <cstdio>#include <cstring>const int N = 1000010;char str[N];原创 2015-10-26 23:12:22 · 820 阅读 · 0 评论 -
HUST - 1010 The Minimum Length(KMP 循环节)
题目大意:给你一个字符串,问构成这个字符串的最小循环节的长度是多少解题思路:就是求这个字符串的循环节了#include <cstdio>#include <cstring>const int N = 1000010;char str[N];int len;int next[N];void getFail() { len = strlen(str); next[0] = -原创 2015-10-26 22:45:39 · 309 阅读 · 0 评论 -
HDU 5510 Bazinga(思维)
题目大意:给你n个字符串,要求你找出符合1 < j <= n,且存在i < j,且i不是j的子集的最大的j解题思路:这题我用dp将其相同的压缩起来,接着再从前往后找了一下#include <cstdio>#include <cstring>const int N = 510;const int M = 2010;int next[N][M], len[N], dp[N];char str[N原创 2015-11-01 00:16:08 · 577 阅读 · 0 评论