51NOD 1277 字符串中的最大值(KMP)
思路:用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)的更多相关文章
- 51Nod 1277 字符串中的最大值(KMP,裸题)
1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如: ...
- 51Nod 1277 字符串中的最大值 ( KMP && DP )
题意 : 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd.给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值.例如:S ...
- 51nod 1277 字符串中的最大值
题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #inc ...
- 51nod 1277字符串中的最大值(拓展kmp)
题意: 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd. 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值. 题解 ...
- 51nod 1292 字符串中的最大值V2(后缀自动机)
题意: 有一个字符串T.字符串S的F函数值可以如下计算:F(S) = L * S在T中出现的次数(L为字符串S的长度).求所有T的子串S中,函数F(S)的最大值. 题解: 求T的后缀自动机,然后所有每 ...
- [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...
- 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串
写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...
- hdoj 4552 怪盗基德的挑战书【求前缀在字符串中出现的次数之和】
怪盗基德的挑战书 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Su ...
- 【剑指offer】替换字符串中的空格
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25002199 剑指offer上的第四道题目,在九度OJ上測试通过,但还是有些问题.由于是用 ...
随机推荐
- Jquery ajax json 值回传不了
今天调试系统的时候,MVC 框架下调用ajax 值,回传的json值获取不到,后来发现竟然是服务没开,郁闷不已,留个截图,做个纪念.
- C# 判断两个矩形是否相交
源代码 public bool JudgeRectangleIntersect(double RecAleftX, double RecAleftY, double RecArightX, doubl ...
- java编程中的断言工具类(org.springframework.util.Assert)
转自:https://blog.csdn.net/gokeiryou263/article/details/19612471 断言工具类:Assert类, java.lang.Object ---&g ...
- 10.19NOIP模拟赛(DAY2)
/* 正解O(n)尺取法orz 我写的二分答案.本来以为会被卡成暴力分...... 这个-'0'-48是我写的吗........我怎么不记得... */ #include<bits\stdc++ ...
- 源码阅读之HashMap(JDK8)
概述 HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的. HashMap最多只允许一条记录的键为null,允许多条记录 ...
- ASP.NET SQL 总结(2)
Sql常见面试题(总结) 1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name kecheng fenshu 张三 语文 81 张三 数学 ...
- [Usaco2005 oct]Flying Right 飞行航班
Description 为了表示不能输给人类,农场的奶牛们决定成立一家航空公司.她们计划每天早晨,从密歇根湖湖岸的最北端飞向最南端,晚上从最南端飞往最北端.在旅途中,航空公司可以安排飞机停在某些机场. ...
- BFS HDOJ 1728 逃离迷宫
题目传送门 /* BFS:三维BFS,加上方向.用dp[x][y][d]记录当前需要的最少转向数 */ #include <cstdio> #include <algorithm&g ...
- 6.13---shiro
- python实现qq机器人qqbot
title: python实现qq机器人qqbot tags: python date: 2018-6-1 10:19:00 --- 以下内容为转载 一.介绍 qqbot 是一个用 python 实现 ...