
字符串—KMP及其扩展
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
hdu 4763 Theme Section (kmp next应用)
题意:给出n个串,求每个串满足这样的形式EAEBE A和B表示当前串的两个不分,求E的最长长度,A,B可以为空。题解:利用next数组解决,我们只要next[len]表示最长公共前后缀,那么只要枚举中间位置net[i]如果满足等于next[len]那么久输出,不满足说明没有这样E那么答案就是0.注意这种情况ababa,最长公共前后缀重叠了,其实发现一个规律把重叠部分删去上下的部分也是满原创 2015-02-21 16:56:30 · 495 阅读 · 0 评论 -
扩展kmp算法
扩展kmp能求很多字符串的问题,比如最长回文子串,最长重复子串。具体见:扩展mkpvoid get_extend(char T[],int len){ int k=0; next[0]=len; while(k<len-1&&T[k]==T[k+1])k++; next[1]=k; k=1; for(int i=2;i<len;i++)原创 2015-02-13 13:14:54 · 571 阅读 · 0 评论 -
hdu 1867 A + B for you again (kmp扩展)
题意:给出两个串,求这两个串结合的结果,规则是把重复的部分删去,这两个串都可以做头和尾,那么结果首先选择结合后串最短的,第二选择字典序最小的。题解:扩展kmp求最长公共前前缀,对于任意i,如果extend[i]+i==len说明这个是最长的后缀可以输出!!。只要O(n)枚举i即可#include#include#include#include#include#includ原创 2015-02-13 22:27:10 · 459 阅读 · 0 评论 -
poj 2185 Milking Grid (kmp)
题意:给出一个矩阵,求最小的子矩阵是的,子矩阵通过不断复制扩大能包含原矩阵。题解:直接按行和按列求最小循环节,然后求行最小循环节的最小公倍数,以及列的最小循环节的最小公倍数,然后就是两个最小公倍数相乘了。但是注意最小公倍数会大于行的长度或列的长度,所以要判断处理下。#include#include#include#include#includeusing namespac原创 2015-03-02 18:01:53 · 564 阅读 · 0 评论 -
poj 2406 Power Strings (用kmp代替后缀数组求解)
题意:给出一个串,这个串是由R个子串重复得到,求最大的这个R。题解:算法集合之《后缀数组》国家对论文是说用后缀数组可以处理复杂度是O(n),但是感觉大材小用了,这题用kmp完全可以解决。#include#include#include#include#include#include#include#include#includeusing namespace st原创 2015-03-04 22:00:36 · 602 阅读 · 0 评论 -
hdu 4552 怪盗基德的挑战书 (kmp+dp)
求前缀出现的个数,for all i the dp[i]=1 , dp[next[i]]+=dp[i];#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;原创 2015-03-09 18:10:32 · 564 阅读 · 0 评论 -
acdream 1116 Gao the string! (扩展kmp,dp思想,矩阵优化)
题意:题目要求每个后缀能包含多多少前缀,只不过这个数作为斐波那契的下标,求出对应斐波那契的和。题解:首先对于要计算出对应的后缀包含多少前缀,如果单单指考虑这样某个后缀能和多少前缀重合,可以通过扩展kmp求得。因为是求后缀对应的某个子串能包含多少前缀,因此要从后往前递推累加,然后同时计算对应的斐波那契数。开始的时候打斐波那契数的表,想找到循环节通过模处理,但是太大了,打不了,开始还因为这原创 2015-05-10 00:57:19 · 604 阅读 · 0 评论 -
codeforces 126B Password (kmp,next应用)
题意:给出一个串,求出这个串中公共前后缀的最长长度,但是这个最长长度要能在除了前缀和后缀的中间找到。题解:next应用#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long原创 2015-02-21 21:26:24 · 585 阅读 · 0 评论 -
codeforces 432D Prefixes and Suffixes (kmp+dp)
题意:给出一个串,求这个串种即使前缀又是后缀的子串在这个串出现的次数。题解:首先得到next数组,然后定义dp[i]表示长度为i的前缀出现的次数。很好理解了,dp[next[i]]+=dp[i],dp初始化为1。#include#include#include#include#include#include#include#includeusing name原创 2015-02-22 19:13:39 · 711 阅读 · 0 评论 -
codeforces 182D Common Divisors (kmp,next应用)
题意:题意很简单,就是求两个串公约串的个数。题解:要得到两个串的next数组求出格子的最小循环节,然后判断四种情况1、a==len1&&b==len22、a==len1&&b==len13、a==len2&&b==len24、a==b 对于这种情况我是通过很多实例得出的,因为在123都不满足时,如果最小的循环节长度不同是不可能有公约串的。#include#incl原创 2015-02-22 16:22:46 · 573 阅读 · 0 评论 -
codeforces 56D Changing a String (dp编辑距离)
题意:给出两个串,问第一个串变成第二个串的最小操作以及具体操作要输出,操作有删除、插入、替换。题解:dp[i][j]表示第一个串在i,第二个串在j时的最小操作数,删除操作dp[i-1][j],插入操作dp[i][j-1],替换操作或不操作dp[i-1][j-1]。路径打印可以记录路径或者用通用方法(dfs回溯)。#include#include#include#i原创 2015-02-14 13:05:34 · 620 阅读 · 0 评论 -
hdu 4333 Revolving Digits (扩展kmp)
题意:给出一个数字的串,每次可以选择一个位置,然后把位置后面的放到这个串的最前面构成新的串。问构成的新的串中等于这个串,小于这个串,大于这个串的个数。题解:两种做法。一种是直接应用扩展kmp,将原串复制一遍得到两倍的串,然后原串去匹配这个串。得到每个位置的最长前缀长度,如果长度extend[i]>=len说明相等,否则比较下个字符的大小。第二种做法是从定义出发,扩展kmp的ne原创 2015-02-13 13:10:14 · 468 阅读 · 0 评论 -
hdu 3376 Finding Palindromes (kmp+Tire)
题意:给出n个串,n个串可以任意两两组合,求回文的个数。题解:纯恶心的题目,完全没有意义,全部操作只能在一个字符数组上处理,相当于一个字符数组成为n个串的公用。代码还没写完。。。。原创 2015-02-13 21:44:43 · 548 阅读 · 0 评论 -
hust 1328 String (kmp+dp)
题意:给出一个字符串,问这个字符串前缀出现的次数。题解:之前hdu的一道题目一样,但是这次意识到上次的贪心算法是错的,ababa这个数据就可以否定了,不过不知道为什么竟然ac了。这题先算出next数组,然后用dp, dp[i]=dp[next[i]]+1,同时统计ans+=dp[i];#include#include#include#include#include#inc原创 2015-02-21 18:39:22 · 516 阅读 · 0 评论 -
hdu 2087 剪花布条 (kmp入门)
贪心分析下,尽可能选考前面的匹配,每次从上个匹配的位子开始kmp#include#include#include#include#include#include#includeusing namespace std;//typedef long long lld;const int oo=0x3f3f3f3f;//const lld OO=1LL<<61;co原创 2015-02-12 13:37:29 · 507 阅读 · 0 评论 -
hdu 2203 亲和串 (kmp入门)
#include#include#include#include#include#include#includeusing namespace std;//typedef long long lld;const int oo=0x3f3f3f3f;//const lld OO=1LL<<61;const int MOD=(1e9)+7;const int maxn=1000原创 2015-02-12 13:29:20 · 495 阅读 · 0 评论 -
hdu 3336 Count the string (kmp扩展)
题意:给出一个字符串,求这个字符串所有前缀在字符中出现的个数。题解:很明显不能用暴力,kmp的扩展问题,分析这种问题最好是先写出next的代码,然后运行观察next数组对应值和字符串之间的关系,找出变化规律。next[i]的意义表示以i-1结尾的子串中,既是真后缀又是最长前缀的长度。打印了abab这个例子的next数组变化值如下:—————————————— 发现左边表格的原创 2015-02-12 15:31:24 · 422 阅读 · 0 评论 -
hdu 3746 Cyclic Nacklace (kmp扩展—最小循环节)
题意:给出字符串,求至少要加几个字符使得字符串能够成为循环的串。题解:最小循环节,首先我先YY证明一下最小循环节(想了好久),next数组存的是最长公共前后缀的长度,那么这个例子abcdab,next[len]=2,发现其实最小的循环节就是从开头到长度为2的部分+长度为2的部分到长度为2的后缀之前,也就是abcd是最下循环节。那么计算要加入几个就好办了最小循环节:cir=len-n原创 2015-02-12 16:54:32 · 388 阅读 · 0 评论 -
hdu 1358 Period (kmp扩展)
题意:给出一个串,找出这个串中所有满足是循环串的前缀子串,并且输出位子和循环周期。题解:最小循环节i-next[i],水过。#include#include#include#include#include#include#includeusing namespace std;//typedef long long lld;const int oo=0x3f3f3f原创 2015-02-12 19:33:18 · 656 阅读 · 0 评论 -
hdu 2594 Simpsons’ Hidden Talents (kmp扩展)
题意:给出两个串,求既是第一个串的前缀又是第二个串的后缀的最长公共部分。题解:这题两种做法,一种是第二个串和第一个串模式匹配,找出匹配的公共部分,但是情况要分三种来输出很麻烦。直接用性质,因为我们知道next[len]表示的串的最长公共前后缀,那么把第二个串接到第一个串的后面直接求出next数组即可,但是还有一种情况要特判,就是最长公共前轴缀重叠的时候,我YY了几组数据得到了发现了原创 2015-02-12 20:09:33 · 512 阅读 · 0 评论 -
hdu 3613 Best Reward (kmp扩展)
题意:给出一个字符串,并且给出每种字符串对应的价值,现在要二分这个字符串,如果二分的两部分,如果是回文串就加上对应字符的价值所谓这两个部分的价值,如果不是回文两个部分的价值为0。题解:这题相当于可以转化为求回文前缀和后缀,求回文前缀:将原串反转接到原串后面。求回文后缀:将原串接到原串反转后的串后面。人后求next数组,next[len]就最长的那个回文前缀,不断k=next[k]就能找原创 2015-02-12 22:00:03 · 500 阅读 · 0 评论 -
hdu 4513 吉哥系列故事――完美队形II (Manacher)
题意:给出一个队列,求出这个队列满足既是回文并且左断点到终点是成递增的最长子队列。题解:dp,kmp,Manacher,都可以解决。Manacher最高效。#include#include#include#include#include#include#includeusing namespace std;//typedef long long lld;const原创 2015-02-13 20:05:03 · 1508 阅读 · 1 评论 -
hdu 4300 Clairewd’s message (扩展kmp)
题意:题意我真的没看懂!靠!出题心存不良!题解:扩展kmp,裸题。#include#include#include#include#include#include#includeusing namespace std;//typedef long long lld;const int oo=0x3f3f3f3f;//const lld OO=1LL<原创 2015-02-13 16:16:02 · 426 阅读 · 0 评论 -
uva 1358 Generator (kmp,dp(高斯消元解法))
题意:给出一个n,表示可以从26个字母的前n个中任意选取,然后给出一个串A,问生成的串包含A长度的期望。题解:这题dp方程比较容易出来dp[i]表示匹配了i长度的期望。if(s[i+1]==c) dp[i] = dp[i+1] * p;else dp[i] = dp[lost(k)] * p;由于会形成环,所以用高斯消元搞,这题无法用double,应为容易损失精度,只能用分原创 2015-05-07 22:08:52 · 622 阅读 · 0 评论