题意:
一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。
给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。
 
题解:
我们前缀匹配的位置个数随长度是递减的(即长度越长,位置越少)。
用拓展kmp对自身求Next数组
我们就知道了每个前缀能匹配的最大后缀的那些位置
然后按照匹配长度倒序相加即是匹配的位置个数。
 
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1e6 + ;
char S[maxn];
int Next[maxn], extend[maxn];
void GetNext(char *T, int *Next){
int len = strlen(T);
Next[] = len;
int a, p;
for(int i = , j = -; i < len; i++, j--){
if(j < || i + Next[i-a] >= p){
if(j < ) p = i, j = ;
while(p < len && T[p] == T[j])
p++, j++;
Next[i] = j;
a = i;
} else Next[i] = Next[i-a];
}
}
void GetExtend(char *S, char *T, int *extend, int *Next){
GetNext(T, Next);
int a, p;
int slen = strlen(S), tlen = strlen(T);
for(int i = , j = -; i < slen; i++, j--){
if(j < || i + Next[i-a] >= p){
if(j < ) p = i, j = ;
while(p < slen && j < tlen && S[p] == T[j]) p++, j++;
extend[i] = j;
a = i;
} else extend[i] = Next[i-a];
}
}
int Num[maxn];
int main(){
cin>>S;
int len = strlen(S);
GetNext(S, Next);
for(int i = ; i < len; i++) Num[Next[i]]++;
long long ans = , n = ;
for(int i = len; i >= ; i--){
n += Num[i];
ans = max(ans, n*i);
}
cout<<ans<<endl;
}
 
 

51nod 1277字符串中的最大值(拓展kmp)的更多相关文章

  1. 51NOD 1277 字符串中的最大值(KMP)

    >>点击进入原题测试<< 思路:用KMP优化的暴力写了一遍,超时!没有充分利用KMP中next数组的性质. 首先这个题是肯定要用到KMP算法的,然后会有一个next[]数组. ...

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

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

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

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

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

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

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

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

  6. hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)

    传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...

  7. 51nod 1286 三段子串(树状数组+拓展kmp)

    题意: 给定一个字符串S,找到另外一个字符串T,T既是S的前缀,也是S的后缀,并且在中间某个地方也出现一次,并且这三次出现不重合.求T最长的长度. 例如:S = "abababababa&q ...

  8. 拓展KMP算法详解

    拓展KMP解决的问题是给两个串S和T,长度分别是n和m,求S的每一个后缀子串与T的最长公共前缀分别是多少,记作extend数组,也就是说extend[i]表示S[i,n-1](i从0开始)和T的最长公 ...

  9. 拓展kmp总结

    借鉴自:https://blog.csdn.net/dyx404514/article/details/41831947 定义母串S,和子串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长 ...

随机推荐

  1. 【CF813D】Two Melodies

    [CF813D]Two Melodies 题面 洛谷 题解 $dp$: 设$f[i][j]$表示第一个集合以$i$结尾.第二个集合以$j$结尾的合法长度之和最大是多少 明显有$f[i][j]=f[j] ...

  2. 安装centos minimal 版本后安装setup包(linux)

    网络配置好后,输入命令 yum install setuptool,安装过程有两个确认,输入Y即可

  3. javaweb(三十八)——mysql事务和锁InnoDB(扩展)

    MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就My ...

  4. Linux工作管理

    工作管理? 其实也就是把程序放到后台来管理,在windows中也就是最小化,在Linux中是通过命令把程序放到后台中.jobs命令查看后台程序. 对于第一点注意事项,mysql启动是例外的,要是叉掉了 ...

  5. OpenLDAP备份和恢复

    OpenLDAP中数据备份一般分为二种: 1)通过slapcat 指令进行备份 2)通过phpLDAPadmin控制台进行备份 备份方式1: 1)slapcat -v -l openldap-back ...

  6. html页面中完成查找功能

    最近在搞一个被很多人改了的框架,天天看代码看的头的晕了,不过感觉进步还挺大的,自己做了一个后台可配置前台查看两个库不同数据范围的东西,还挺满意,那天拿出来分享一下,今天先说一个这几天做的功能,就是ht ...

  7. Debian 9 + Windows 10 双系统安装体验

    很久之前就想在自己的电脑上也装个 Debian 玩玩了,最近正好有时间折腾,就踩了踩坑在笔记本上装了玩玩~ UEFI + GPT 解决启动相关的麻烦配置 如果在支持 UEFI 的电脑上安装 Debia ...

  8. fastjson&gson

    1.model转fastjson时,model成员变量是对象的,再转成fastjson时,不能仅仅判断key是否存在.应该判断其值是否为"". 2.gson 在 dao层貌似没有用 ...

  9. Ubuntu中Google Chrome安装

    转载自博客 1. 方法一   1.在ubuntu中启动终端   2.在终端中,输入以下命令: sudo wget http://www.linuxidc.com/files/repo/google-c ...

  10. Hibernate:工作原理

    Hibernate的工作原理图如下所示: