扩展KMP (ex_KMP)】的更多相关文章

A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total Submission(s): 1666    Accepted Submission(s): 614 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a present,wh…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割字符串s能获得的最大价值. 解题思路:将原串s反转得到rs,然后进行rs,s扩展KMP匹配,得到extend,对于s1的前i个字符如果和s2的后i个字符相等即extend[len-i] == i则前i个字符为回文串: 同理,判断后len-i个字符是否是回文串用s,rs进行扩展KMP再生成一个exte…
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所有的extend[1..n].容易发现,如果存在某个i,使得extend[i] = m,这便是经典的KMP算法要解决的问题. 二 扩展KMP算法思想 和KMP算法的是想类似,充分利用已经比较字符性质来减少冗余的字符比较次数.KMP的思想是充分的利用模式串中所有前缀字串(以模式串为开头的字串)的真前缀…
Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权值(可能为负),你需要将这个字符串分成两个子串,使得这两个子串的价值之和最大.一个子串价值的计算方法:如果这个子串是回文串,那么价值就是这个子串所有字符权值之和:否则价值为0. analyse: 扩展KMP算法运用.总体思路:找出所有包含第一个字母的回文串和包含最后一个字母的回文串,然后O(n)扫一…
文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strlen(t); f[]=f[]=; ;i<lt;++i) { int j=f[i]; while(j&&t[j]!=t[i]) j=f[j]; ]=j+;]=; } ; ;i<ls;++i) { while(j&&t[j]!=s[i]) j=f[j]; if(t[j]…
扩展KMP的简单题. #include<stdio.h> #include<string.h> #define maxn 51010 char s[maxn],t[maxn]; int extand[maxn],next[maxn]; void getnext(char *t) { int i,k,j,len=strlen(t); next[]=len; i=; &&t[i]==t[i+]) { i++; } next[]=i; ; ;k<len;k++) {…
慢慢研究可以发现,可以用扩展kmp来求.由于扩展kmp的next[]只有一部分,当前位子前面那部分和母串的后部分,所以可以将字符串复制接在后面一次. 先求如果next[]>0&&next[]!=len,那么只要考虑后面那位的大小比较.如果next[]>=len 那就是相同.如果next[]==0,就是没有相同的,直接比较开头. 这样做还是会超时,我tle无数发. 还要去掉重复的部分,题目要求不同的.所以求出循环部分,只要考虑一部分即可. //扩展kmp求最小循环节 int kk…
刘雅琼论文 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 论文讲的非常详细. 给定母串S,子串T,n=strlen(S),m=stlrne(T);extand[i]=S[i...n]与T的最长公共前缀长度,要在线性时间求出所有extand[]. 下面是代码 #define maxn 10010 int extand[maxn],next[maxn]; void getnext(char *t) { int i,j,len=st…
题目大意: 找到字符串中所有和前缀字符串相同的子串的个数 对于这种前缀的问题,通常通过扩展kmp来解决 其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模板是做到这道题直接copy的 这里用扩展kmp很好解决问题,_next[i],表示第i位开始所能匹配到的最大公共前缀长度,比如说这个长度为4,那么说明前缀1,2,3,4都出现了一次,我们只在cnt[4]++ 那么最后从n到1,逆向更新cnt[i] += cnt[i+1]即可,最后得到cnt[i]就表…
今天是字符串填坑的一天,首先填的第一个坑是扩展KMP.总结一下KMP和扩展KMP的区别. 在这里s是主串,t是模式串. KMP可以求出的是以s[i]为结尾的串和 t前缀匹配的最长的长度.假如这个长度是L的话,则: s[i-L+1...i]=t[0...L] 而所谓的失配指针f[i]指的就是当前i点失配时要匹配的长度,实际是用t文本串去匹配t. 扩展KMP则是以s[i]为起始的串和 t前缀匹配的最长的长度. 假如这个长度的话,则: s[i..i+L-1]=t[0...L] 扩展KMP里的nxt数组…