题意 : 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd.给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值.例如:S = "abababa" 所有的前缀如下: "a", 长度与出现次数的乘积 1 * 4 = 4, "ab",长度与出现次数的乘积 2 * 3 = 6, "aba", 长度与出现次数的乘积 3 * 3 = 9, "abab&…
1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd. 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值. 例如:S = "abababa" 所有的前缀如下:   "a", 长度与出现次数的乘积 1 * 4 = 4, "ab",长度…
题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #include<cstdio> #include<cstring> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9…
题意: 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd. 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值.   题解: 我们前缀匹配的位置个数随长度是递减的(即长度越长,位置越少). 用拓展kmp对自身求Next数组 我们就知道了每个前缀能匹配的最大后缀的那些位置 然后按照匹配长度倒序相加即是匹配的位置个数.   #include <iostream> #include <cstring> usin…
>>点击进入原题测试<< 思路:用KMP优化的暴力写了一遍,超时!没有充分利用KMP中next数组的性质. 首先这个题是肯定要用到KMP算法的,然后会有一个next[]数组. 用一个数组来sum[i]表示长度为i的前缀的字符串有多少个,于是默认所有初始值为1: 然后倒着递推sum[next[i]]+=sum[i];原理的话自己找个样例手动模拟一下应该就清楚了,真的是很神奇的一个规律. 注意使用长整形,有个样例会溢出! 参照一下帖子 https://blog.csdn.net/lar…
题意: 有一个字符串T.字符串S的F函数值可以如下计算:F(S) = L * S在T中出现的次数(L为字符串S的长度).求所有T的子串S中,函数F(S)的最大值. 题解: 求T的后缀自动机,然后所有每个后缀自动机的结点u 求出endpos[u]*maxlen[u]中的最大值即可 #include <iostream> #include <cstdio> #include <cstring> using namespace std; ; ; , last = ; ], p…
参考连接: KMP+DP: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html 另外给出一个没用dp做的:http://blog.sina.com.cn/s/blog_82061db90100usxw.html 题意: 给出一个字符串,求它的各个前缀在字符串中出现的次数总和. 思路:记 dp[i] 为前 i 个字符组成的前缀出现的次数则 dp[next[i]]+=dp[i] dp[i]表示长度为i的前缀出现的次数,初…
转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Prefixes and Suffixes You have a string s = s1s2...s|s|, where |s| is the length of string s, and si its i-th character. Let's introduce several definitions: A substring s[i..j] (1 ≤ i ≤ j…
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 分析 : 有两种做法,如果会拓展KMP的话可以说这就是一道模板题了,拓展KMP专门就是找最长公共前缀的长度,首先将给出的两个字符串双双反转,用模式串去跟主串跑一遍拓展KMP,得到 extend 数组,然后只要遍历一遍 extend 数组,每一个 extend[i] 表示模式串里面前 extend[i…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种替换方法. kmp求出b在a中完全匹配后的结尾位置,然后dp(i)表示匹配到i时替换的方案数(不替换也算一次方案).首先更新dp(i)=dp(i-1),当且仅当i点是一个完全匹配的终点时,加上dp(i-nb)处的值. #include <bits/stdc++.h> using namespace…