
数据结构-KMP
文章平均质量分 53
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
hdu 4749 Parade Show(KMP)
题目链接:Parade Show题目大意:学校要举办一场典礼,要从n个学生中选若干支队伍来,每支队伍有m个人。然后现在将学生的身高划分成k个等级,接着按照学生的顺序给出学生的身高等级,再然后,给出m个人的队伍要求的相对高度。然后要求从n个中间挑选连续的m个人,满足相对高度即可组成一支队伍。问说最多可以组成多少支队伍。解题思路:KMP算法的变形,只不过在判断相等的时候有点原创 2014-03-16 21:29:06 · 1372 阅读 · 0 评论 -
uva 11557 - Code Theft(KMP)
题目链接:uva 11557 - Code Theft题目大意:给定n个文本,每个文本有一个文本名,现在给出一个文本,求给定文本和n个文本中连续相同行数最大值,并且输出文本名,注意为0时不用输出其它的文本名。解题思路:将每个字符串用映射成一个hash值,然后对匹配文本枚举后缀,建立失配数组进行KMP匹配,记录下每个文本的匹配最大值。#include #include #in原创 2014-09-04 22:27:34 · 935 阅读 · 0 评论 -
uva 11888 - Abnormal 89's(KMP)
题目链接:uva 11888 - Abnormal 89's题目大意:给定一个字符串,判断该字符串是否由两个非空的回文串组成,在判断是否是一个回文。解题思路:KMP,将字符串翻转,然后用翻转后的字符串去匹配原字符串,然后匹配到最后的匹配值为p,那么后p个字符组成的字符串一定是回文串,并且所有的失配p都是回文,然后在用原串去匹配翻转后的字符串,同样的道理,如果两边有相加等于n(字符串原创 2014-09-04 22:46:14 · 1232 阅读 · 0 评论 -
uva 10298 - Power Strings(KMP)
题目链接:poj 2406 Power Strings题目大意:给出一个字符串,求出该字符串是由几个最小循环节组成的。解题思路:KMP, n-next[n]即为最小循环节。#include #include const int N = 1000005;int n, next[N];char s[N];void getNext () { in原创 2014-03-19 21:57:38 · 2345 阅读 · 0 评论 -
uva 1328 Period(KMP)
题目链接:hdu 1358 Period题目大意:给出一个长度为n的字符串,要求找到一些i,满足说从1~i为两个的重复子串构成,并输出子串的个数。解题思路:KMP,只是在求next数组的时候,对于每个位置的next[i]都进行判断,如果i%(i-next[i]) = 0,即为满足的位置。#include #include const int N = 1e6原创 2014-03-18 17:02:03 · 1424 阅读 · 0 评论 -
uva 11475 - Extend to Palindrome(KMP)
题目链接:uva 11475 - Extend to Palindrome题目大意:给定一个字符串,输出最少需要添加多少个字符使得字符串变成回文串。解题思路:以字符串的转置做KMP,然后用原串匹配即可,最后匹配长度即为重复长度。#include #include #include using namespace std;const int maxn = 1e5+5;原创 2014-09-01 22:20:09 · 1927 阅读 · 0 评论 -
uva 12012 - Detection of Extraterrestrial(KMP)
题目链接:uva 12012 - Detection of Extraterrestrial题目大意:给定一个字符串,问说子串中,循环次数为k个最大长度为多少。解题思路:枚举起点位置,然后用KMP处理。#include #include #include using namespace std;const int maxn = 1005;int jump[maxn原创 2014-09-04 23:09:39 · 1172 阅读 · 2 评论 -
poj 2185 Milking Grid(KMP)
题目链接:poj 2185 Milking Grid题目大意:给定一个N∗M的矩阵,找到一个最小的r∗c的矩阵,使得原矩阵可以由若干个小矩阵组成,输出r∗c的值。解题思路:将行和列分别看成字符串,然后hash,对hash后的数组分别求KMP。#include #include #include using namespace std;typedef unsigned原创 2014-10-27 16:42:43 · 1051 阅读 · 0 评论 -
hdu 4333 Revolving Digits(拓展KMP)
题目连接:hdu 4333 Revolving Digits题目大意:给定一个数,每次将头一个数放到最后,这样形成n个数,去掉重复的后,考虑有多少个数比原先的数小,等于,大。解题思路:拓展KMP的应用,上模板水一下就行了。#include #include #include using namespace std;const int maxn = 10000原创 2014-11-16 15:02:19 · 1118 阅读 · 0 评论 -
hdu 2594 Simpsons’ Hidden Talents(KMP)
题目链接:hdu 2954 Simpsons’ Hidden Talents题目大意:给出两个字符串,找出一个子串,为s1的前缀,s2的后缀, 要求子串最长,并且输出该子串。解题思路:将s1和s2首尾相连,然后求出next数组的next[n+m]的位置,然后和n、m取最小值即为答案。#include #include #define min(a,b) (原创 2014-03-18 22:29:25 · 1117 阅读 · 0 评论 -
uva 1358 - Generator(KMP+期望)
题目链接:uva 1358 - Generator题目大意:给定n,表示有n中字符,然后给定一个字符串S,一开始字符串为空,现在每次随机生成一个1~n的字符添加到字符串末尾,问说字符串包含S为子串的生成次数期望。解题思路:首先要对S进行预处理,求出失配数组。定义dp[i]表示末尾部分匹配了i个S串所需要的次数期望,每次枚举可能出现的字符1~n。对于S字符串,i+1肯定是确定原创 2014-09-04 22:07:43 · 1539 阅读 · 0 评论 -
uva 11604 - General Sultan(KMP+dfs)
题目链接:uva 11604 - General Sultan对两两字符串做处理,以i,j为节点,表示第i个字符串的第j个字符。#include #include #include #include #include using namespace std;const int maxn = 105;const int maxm = 25;int N, j原创 2015-09-11 21:20:27 · 925 阅读 · 0 评论 -
hdu 5442 Favorite Donut(最小表示法+kmp)
题目链接:hdu 5442 Favorite Donut正序逆序分别做一遍最小表示法,但是因为逆序求出最小表示法下标对应的是为最大值,所以我们用kmp求出循环节长度,然后用下标取模即可。#include #include #include #include #include #include #include using namespace std;con原创 2015-09-13 21:52:59 · 921 阅读 · 0 评论 -
Codeforces 432D Prefixes and Suffixes(KMP+dp)
题目连接:Codeforces 432D Prefixes and Suffixes题目大意:给出一个字符串,求所有既是前缀串又是后缀串的字符串出现了几次。解题思路:根据性质可以根据KMP算法求出所有的前后缀串,然后利用dp求解,dp[i]表示从1到i这个子串出现过的次数。转移方程dp[jump[i]]+=dp[i]。任意一个dp[i]的初始状态应该是1。#include #原创 2014-05-17 21:58:25 · 2588 阅读 · 0 评论 -
hdu 4763 Theme Section(KMP)
题目链接:hdu 4763 Theme Section题目大意:给出一个字符串,问说是否是sasbs的形式,s、a、b表示一个字符串,可以为空,输出最长的s串的长度。解题思路:KMP,首先先求出最长后缀,然后用KMP算法判断去掉前后部分后是否存在该串。不存在则缩小长度。#include #include const int N = 1e6+5;in原创 2014-03-20 08:37:04 · 1151 阅读 · 0 评论 -
hdu 2328 Corporate Identity(KMP)
题目链接:hdu 2328 Corporate Identity题目大意:给出若干个串,求最长公共子串。解题思路:和poj 3080一样的做法。#include #include #include using namespace std;const int N = 4005;const int M = 205;int n, m, len, j原创 2014-03-19 22:32:26 · 1516 阅读 · 0 评论 -
hdu 2087 剪花布条(KMP)
题目连接:hdu 2087 剪花布条题目大意:中文题。。。。解题思路:KMP,还是找到匹配项的地方入手,让p = 0即可。#include #include const int N = 1005;int n, m, next[N], i;char T[N], W[N];void getNext () { int p = 0; m原创 2014-03-17 18:59:11 · 767 阅读 · 0 评论 -
hdu 1686 Oulipo(KMP)
题目链接:hdu 1686 Oulipo题目大意:给出两个字符串W, T,问说T字符串中有几个子串和W字符串匹配。解题思路:KMP,只不过在找到匹配串的时候不能直接跳出或者说让p=0,应该让p = next[p]。#include #include const int N = 1000005;const int M = 10005;int n,原创 2014-03-17 18:56:14 · 850 阅读 · 0 评论 -
hdu 3746 Cyclic Nacklace(KMP)
题目链接:hdu 3746 Cyclic Nacklace题目大意:问说最少需要在添加几个值,可以是字符串变成以一个子字符串循环得到的(至少有两个该子串)解题思路:KMP的变形吧,将字符串的next数组求出来,next[n]是关键;k = n - next[n],如果k = 0的话,说明没有一个匹配的字符,那么至少就要添加n个;n%k = 0的话,说明该字符串已经满足了要求原创 2014-03-17 19:23:14 · 1531 阅读 · 0 评论 -
hdu 1711 Number Sequence(KMP)
题目链接:hdu 1711 Number Sequence题目大意:给出两个序列,问说第二个序列是否能在第一个序列中找到匹配的子序列,可以的话输出第一个匹配序列的第一个位置,否则输出-1解题思路:KMP,将序列看成是一个字符串,然后找到一个匹配的跳出即可,如果都没有找到的话输出-1.#include #include const int N = 100原创 2014-03-17 18:51:44 · 731 阅读 · 0 评论 -
hdu 2203 亲和串(KMP)
题目链接:hdu 2203 亲和串题目大意:略。解题思路:将s1复制一倍,就是裸的KMP了。#include #include const int N = 1e5+5;int n, m, next[N];char s1[2*N], s2[N], tmp[N];void getNext () { int p = 0; for (int i =原创 2014-03-18 17:20:23 · 854 阅读 · 3 评论 -
poj 3080 Blue Jeans(KMP)
题目链接:poj 3080 Blue Jeans题目大意:给出若干个串,求出这若干个串的最长公共子串。解题思路:枚举第一个串的起始,作为匹配串,和剩下的所有串进行KMP维护最长的公共串。#include #include #include using namespace std;const int N = 105;const int M = 15原创 2014-03-19 22:06:42 · 1176 阅读 · 0 评论 -
hdu 3336 Count the string(KMP)
题目链接:hdu 3336 Count the string题目大意:给出一个字符串,要求计算所有前缀串在该字符串中出现次数的总和。解题思路:首先求出jump数组,然后对于每个位置来说,如果jump[p]!=0的话,即为存在一个前缀串,注意这里p = jump[p], 因为前缀串中含可能包含前缀串。最后要+n。#include #include con原创 2014-03-19 22:12:19 · 1026 阅读 · 0 评论 -
hdu 4300 Clairewd’s message(KMP)
题目链接:hdu 4300 Clairewd’s message题目大意:题目意思比较难懂,给出两个字符串,第一个字符串为编码规则,比如说样例1,q位于第一个位置,表示说q的编码是a。然后给出另一个字符串s,要求添加尽量少得字符,使得f可以被分成两部分f1+f2, 然后f1编码后等于f2,然后注意给出的f串为编码串,并非原串。解题思路:首先先将f串转换成原串s,然后求出原创 2014-03-19 22:20:47 · 1077 阅读 · 0 评论 -
hdu 1238 Substrings(KMP)
题目链接:hdu 1238 Substrings题目大意:给出若干个字符串,求一个最长的公共子串,该公共子串可以以逆序的形式存在在字符串中。解题思路:枚举第一个串的开头做为匹配串,然后让该串和其他所有字符串求最长公共串的时候要去字符串正序和逆序中较大的。#include #include #include using namespace std;c原创 2014-03-19 22:25:34 · 1255 阅读 · 0 评论 -
hdu 3374 String Problem(KMP + 最小串)
题目链接:hdu 3374 String Problem题目大意:给出一个,字符串,每次将最前一个字符放到最后,知道形成一周,然后按照每个字符串出现的先后排个名次,现在要求求出字典序最小的字符串和字典序最大的字符串为RANK几。并输出它们的出现次数,如果出现次数不只一次,那么输出RANK值较小的。解题思路:KMP中的求最小串,然后用最小串去原字符串中求匹配数量。原创 2014-03-19 22:38:34 · 1345 阅读 · 0 评论 -
fzu 1901 Period II(KMP)
题目链接:fzu 1901 Period II题目大意:给出一个字符串,要求找出所有的p,使得说s[i] = s[i+p] (i 解题思路:其实就是求所有的前缀后缀串,p = n, 然后一直循环p = jump[p]; 直到p = 0,其他的p值,n - p都是答案。#include #include const int N = 1e6+5;in原创 2014-03-19 22:50:54 · 1576 阅读 · 0 评论 -
poj 2752 Seek the Name, Seek the Fame(KMP)
题目链接:poj 2752 Seek the Name, Seek the Fame题目大意:给出一个字符串,要求找出所有的子串满足是该字符串的前缀的同时也是后缀,输出下表即可。解题思路:首先getJump后,获得jump[n]即为最大的匹配的前缀后缀串,这样的话不断p = jump[p]直到p = 0都是满足的前缀后缀串。#include #includ原创 2014-03-19 22:02:44 · 1067 阅读 · 0 评论 -
hdu 4668 Finding string(KMP)
题目链接:hdu 4668 Finding string解题思路肯定要把第一个串张开,对于每个循环的位置,展开两个长度超过b的字符串,然后中间留一个循环节代替剩余的循环次数。如果不够就直接展开即可。算一下就知道,长度不会很长。然后做kmp,一般匹配一次是加上1,但是如果匹配到循环节的位置,则要加上它代替的字符串个数。代码#include <cstdio>#include <cstring>#in原创 2015-11-06 21:46:28 · 629 阅读 · 0 评论