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

思路:用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. asp.net mvc6学习资料整理

    十分钟轻松让你认识ASP.NET MVC6 http://www.cnblogs.com/n-pei/p/4272105.html ASP.NET 5系列教程 (六): 在 MVC6 中创建 Web ...

  2. noip2016 小结(ac两题+学习总结)

    NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...

  3. Akka源码分析-Akka-Streams-概念入门

    今天我们来讲解akka-streams,这应该算akka框架下实现的一个很高级的工具.之前在学习akka streams的时候,我是觉得云里雾里的,感觉非常复杂,而且又难学,不过随着对akka源码的深 ...

  4. HDU4947GCD Array(莫比乌斯反演+树状数组)

    题面 传送门 题解 orz ljz 相当于每一个数要加上 \[v\times [\gcd(i,n)=d]=v\times [\gcd(i/d,n/d)=1]=v\times \sum_{p|{i\ov ...

  5. less新手入门(四)—— Mixin Guards

    八.Mixin Guards 有条件的 mixin 当您想要匹配表达式时,相对于简单的值或特性,Guards是有用的.如果您熟悉函数式编程,您可能已经遇到过它们. 为了尽可能地保持CSS的声明性质,在 ...

  6. Linux安装PHP环境

    简介: PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要 ...

  7. Android 性能优化(7)网络优化( 3) Optimizing User-Initiated Network Use

    Optimizing User-Initiated Network Use This lesson teaches you to Pre-fetch Network Data Check for Co ...

  8. php 5.6 版本配置 oracle ddl

    1. Windows版PHP内置了Oracle驱动,在ext目录下:php_oci8.dllphp_oci8_11g.dllphp_pdo_oci.dllLinux上如果自己编译的话则添加下面的con ...

  9. RabbitMQ一:消息队列的认识

    1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信.传统的做法有两种1.串行的方式:2.并行方式. (1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信.以上三个任务全部完 ...

  10. Oracle数据库数据显示乱码问题解决方法。

    一.问题描述:       在将其它数据库的数据导出文件导入本地新建数据库时,所导入的数据全部是乱码,一般表现为数据表中列的值类似于"?????",即内容大部分为?的表现形式.初步 ...