》》点击进入原题测试《《

思路:用KMP优化的暴力写了一遍,超时!没有充分利用KMP中next数组的性质。

首先这个题是肯定要用到KMP算法的,然后会有一个next[]数组。

用一个数组来sum[i]表示长度为i的前缀的字符串有多少个,于是默认所有初始值为1;

然后倒着递推sum[next[i]]+=sum[i];原理的话自己找个样例手动模拟一下应该就清楚了,真的是很神奇的一个规律。

注意使用长整形,有个样例会溢出!

参照一下帖子 https://blog.csdn.net/largecub233/article/details/62039957

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int ne[];
void cal_next(string str)
{
ne[] = -;
int k = -;
for (int i = ; i < str.length(); i++){
while (k != - && str[k + ] != str[i])
k = ne[k]; if (str[k + ] == str[i])k += ;
ne[i] = k;
}
}
int kmp(string str, string str2)
{
int k = -, sum = ; for (int i = ; i < str.length(); i++){
while (k>- && str[k + ] != str[i])
k = ne[k];
if (str[k + ] == str[i])
k += ;
if (k == str2.length() - ){
sum++;
i -= ne[k] + ;
k = -;
}
}
return sum;
}
int main()
{
string a; cin >> a;
int maxs = ;
cal_next(a);
for (int i = ; i <= a.length(); i++){
string temp = a.substr(, i);
int ans = kmp(a, temp);
// cout << temp.length() << " " << ans << endl;
if (ans*temp.length() > maxs)
maxs = ans*temp.length();
}
cout << maxs << endl;
return ;
}

暴力超时代码

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll ne[], sum[];
void cal_next(string str)
{
ne[] = -;
int k = -;
for (int i = ; i < str.length(); i++){
while (k != - && str[k + ] != str[i])
k = ne[k]; if (str[k + ] == str[i])k += ;
ne[i] = k;
}
}
int kmp(string str, string str2)
{
int k = -, sum = ; for (int i = ; i < str.length(); i++){
while (k>- && str[k + ] != str[i])
k = ne[k];
if (str[k + ] == str[i])
k += ;
if (k == str2.length() - ){
sum++;
i -= ne[k] + ;
k = -;
}
}
return sum;
}
int main()
{
string a; cin >> a;
ll maxs = ;
for (int i = ; i <= a.length(); i++)
sum[i] = ; cal_next(a);
for (int i = a.length() - ; i >=; i--){
maxs = max(maxs,(i+)*sum[i+]);
sum[ne[i]+] += sum[i+];
}
cout << maxs << endl;
return ;
}

51NOD 1277 字符串中的最大值(KMP)的更多相关文章

  1. 51Nod 1277 字符串中的最大值(KMP,裸题)

    1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如: ...

  2. 51Nod 1277 字符串中的最大值 ( KMP && DP )

    题意 : 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd.给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值.例如:S ...

  3. 51nod 1277 字符串中的最大值

    题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #inc ...

  4. 51nod 1277字符串中的最大值(拓展kmp)

    题意: 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd. 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值.   题解 ...

  5. 51nod 1292 字符串中的最大值V2(后缀自动机)

    题意: 有一个字符串T.字符串S的F函数值可以如下计算:F(S) = L * S在T中出现的次数(L为字符串S的长度).求所有T的子串S中,函数F(S)的最大值. 题解: 求T的后缀自动机,然后所有每 ...

  6. [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  7. 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串

    写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...

  8. hdoj 4552 怪盗基德的挑战书【求前缀在字符串中出现的次数之和】

    怪盗基德的挑战书 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Su ...

  9. 【剑指offer】替换字符串中的空格

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25002199 剑指offer上的第四道题目,在九度OJ上測试通过,但还是有些问题.由于是用 ...

随机推荐

  1. bzoj3196 二逼平衡树——线段树套平衡树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 人生中第一棵树套树! 写了一个晚上,成功卡时 9000ms+ 过了! 很要注意数组的大 ...

  2. mipi差分信号原理

    差分信号,什么是差分信号 一个差分信号是用一个数值来表示两个物理量之间的差异.从严格意义上来讲,所有电压信号都是差分的,因为一个电压只能是相对于另一个电压而言的.在某些系统里,系统’地’被用作电压基准 ...

  3. 谷歌浏览器(Chrome)查看http报文headers信息

    转自:https://blog.csdn.net/floatdreamed/article/details/79208719 ①打开谷歌浏览器,随意输入要搜索的内容 ②按下F12键,此时会弹出浏览器的 ...

  4. ODP.NET Managed 相关文章收集

      一.Oracle 对.net支持的一些基础知识了解介绍. 1.早年的时候,微软自己做的有 System.Data.OracleClient. 现在已经成了过期类了.性能等都不是很好. 2.Orac ...

  5. bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会【tarjan】

    几乎是板子,求有几个size>1的scc 直接tarjan即可 #include<iostream> #include<cstdio> #include<cstri ...

  6. Storm概念学习系列之核心概念(Tuple、Spout、Blot、Stream、Stream Grouping、Worker、Task、Executor、Topology)(博主推荐)

    不多说,直接上干货! 以下都是非常重要的storm概念知识. (Tuple元组数据载体 .Spout数据源.Blot消息处理者.Stream消息流 和 Stream Grouping 消息流组.Wor ...

  7. [译]HTTP POSTing

    HTTP POSTing We get many questions regarding how to issue HTTP POSTs with libcurl the proper way. Th ...

  8. 继承static的注意点

    继承static的注意点 singleton模式会使用 <?php class Auth { protected static $_instance = null; /** * 单用例入口 * ...

  9. ajax怎么理解?

    Ajix是创建交互式网页的前端网页开发技术,不是一种语言,ajax是基于http来传输数据的,他是利用浏览器提供操作http的接口(XMLHttpRequest或者activeXobject),来操作 ...

  10. OKHTTP 简单分析

    内部使用了OKIO库, 此库中Source表示输入流(相当于InputStream),Sink表示输出流(相当于OutputStream) 特点: ·既支持同步请求,也支持异步请求,同步请求会阻塞当前 ...