51nod1277字符串中的最大值题解(KMP算法)

深入剖析:NAND Flash与SD NAND(贴片式SD卡)存储扇区分配表架构差异与优化策略 本文深入探讨了NAND Flash与SD NAND(贴片式SD卡)在存储技术中的架构差异及其优化策略。NAND Flash作为非易失性存储器,依赖主控芯片进行坏块管理和磨损均衡,而SD NAND则通过内置控制器和标准文件系统(如FAT)简化了存储管理。两者在写入性能、容量扩展和可靠性方面各有优劣,NAND Flash需通过磨损均衡和写入合并优化性能,而SD NAND则通过高容量和高速传输提升效率。文章为嵌入式系统开发者和硬件工程师提供了关于如何根据需求选择并优化存储介质的参考。 阅读详情

题目:51nod1277.
题目大意:给定一个长度为 n n n的串,求出它前缀的最大值,其中一个前缀的值定义为这个前缀在字符串中出现的次数乘以这个前缀的长度.
1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1≤n≤105.

很明显一道字符串前缀相关的题,而且还是单串匹配,所以就是KMP了.

考虑先求出 n e x t next next数组,我们考虑一个前缀出现次数如何通过 n e x t next next数组计算.

这道题其实是要知道每个前缀的出现次数就可以了,所以我们记录一个 s u m sum sum数组,其中 s u m [ i ] sum[i] sum[i]表示前缀 S [ 1.. i ] S[1..i] S[1..i]在串中出现的次数.

考虑计算 s u m sum sum,我们可以发现前缀 s u m [ 1.. i ] sum[1..i] sum[1..i]对 s u m [ 1   n e x t [ i ] ] sum[1~next[i]] sum[1 next[i]]都有 1 1 1的贡献,但是这里如果直接用差分维护区间加貌似会重复计数.

既然直接求不行,那就考虑 s u m [ i ] sum[i] sum[i]与其他 s u m sum sum值的关系,发现若 n x t [ j ] = i nxt[j]=i nxt[j]=i,那么就是说所有 s [ 1.. j ] s[1..j] s[1..j]出现的地方都会出现 s [ 1.. i ] s[1..i] s[1..i].这提醒我们 s u m [ i ] sum[i] sum[i]其实可以这样计算:
s u m [ i ] = 1 + ∑ n e x t [ j ] = i s u m [ j ] sum[i]=1+\sum_{next[j]=i}sum[j] sum[i]=1+next[j]=i∑​sum[j]

所以我们只需要倒推解决这道题,可以做到 O ( n ) O(n) O(n),由此我们得到了这道题的解法.

其实我们可以用 n e x t next next树来解释上面这个式子,因为 n e x t next next树上一个节点是它所有子树的前缀,所以一个节点为根的子树中任意一个节点都会对它有贡献,这样这个式子就很好解释了.

代码如下:

#include<bits/stdc++.h>
  using namespace std;
 
#define Abigail inline void
typedef long long LL;
 
const int N=1000000;
 
char a[N+9];
int n,nxt[N+9];
LL sum[N+9],ans;
 
void self_mate(){
  nxt[1]=0;
  int j=0;
  for (int i=2;i<=n;++i){
    while (a[i]^a[j+1]&&j>0) j=nxt[j];
    if (a[j+1]==a[i]) ++j;
    nxt[i]=j;
  }
}
 
Abigail into(){
  scanf("%s",a+1);
  n=strlen(a+1);
}
 
Abigail work(){
  self_mate();
  for (int i=n;i>=1;--i){
    ++sum[i];
    sum[nxt[i]]+=sum[i];
    ans=max(ans,sum[i]*i);
  }
}
 
Abigail outo(){
  printf("%lld\n",ans);
}
 
int main(){
  into();
  work();
  outo();
  return 0;
}
49、非合作目标运动参数估计与状态滤波方法研究 本文研究了非合作空间目标的运动参数估计与状态滤波方法。通过分析目标的章动运动特性,建立了运动方程,并分别提出了基于最小二乘法的质心运动参数估计方法和旋转运动参数估计方法。同时,设计了误差状态卡尔曼滤波器(ESKF)用于姿态滤波和角速度估计,以提高估计精度。仿真实验验证了所提方法的有效性,能够准确估计目标的运动参数和状态信息,为在轨服务提供了技术支持。 阅读详情

相关推荐

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1530

KMP算法

t[next[i]]和t[i-next[i]+1]t[i-next[i]+2]…如果无法移动,向右移动1位。因此,我们现将Next数组求出来,然后从后向前求出每个前缀i在字符串中出现的次数cnt[i],根据上面的结论我们递推出cnt[p[i]]+=cnt[i]上图中,我们可以在判断t[next[next[i]]+1]是否等于t[i+1],如果相等则说明next[i]=next[next[i]]+1。如果t[Next[i]+1]==t[i+1],那么Next[i+1]显然应该等于Next[i]+1.

m0_70976473的博客 730

Java + Selenium + TestNg + Allure Web UI 自动化

我们知道,在Python中针对Web UI自动化有Python + Selenium + Pytest/Unittest +Allure的技术栈。那么对于Java而言,也有其独特的Web UI 自动化技术栈。相同的,我们同样的运用Selenium框架,测试报告同样运用Allure。不同的是,我们运用的语言由Python转化为了Java,测试用例管理框架从Pytest转化为了TestNG。

qq_45594960的博客 1913

JZOJ5485. 【清华集训2017模拟11.26】字符串

Description一个字符串的权值是这个串包含的不同字符个数。 给定一个长度为n的字符串,把它分为k个连续非空字段,每个字符必须在某一段中,最小化字符串的权值和。Input第一行两个数n,k,含义如题所述。 接下来一行一个长度为n的字符串,保证仅包含小写英文字母。Output输出最小权值。Sample Input输入1: 12 3 abaacdddfeff 输入2: 50 35 a

lijf2001的博客 400

3D Slicer中安装MedSAM插件

大家应该都读过这篇论文:《Segment Anything in Medical Images》这个插件便是该论文团队推出的在3D Slicer上使用的插件,可以分割医学图像的任何感兴趣区域。

m0_73719342的博客 2331

动力学约束下的运动规划算法——Kinodynamic RRT*算法

动力学约束下的运动规划算法——Kinodynamic RRT*算法

慕羽★的博客 6753

将一个数组拆分成k段,对每个段求和,如何使和最小的段取到最大值

总的解题思路: 既然要将数组arr分成k段,那么后面段的拆分,依赖于前一段的拆分。假设第一段已经拆分好了,那么后续的段就可以在此基础上进行拆分。整个数组拆分成k段有若干种情况,针对每一种情况,我们可以求出第n次拆分中最小段的和,同时与迄今为止保留的最小段的和最大的那个进行比较,保留较大的一方,直到遍历所有的拆分方案。 拆分并不是无穷无尽的,比如第一段的start和end下标,就一定要满足end <= arr.length-k+1,否则数组后续的元素个数,都不够剩余的k-1段分配。 public cla

weixin_42785235的博客 3345

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 61

计算一个字符串中每个字符的权值C语言,C语言程序设计课程计题目1.doc

C语言程序设计课程计题目1通信工程10级C语言课程设计任务书各位同学可以自由组合,不超过以下题目中所规定的人数进行选题(不允许重复选题)。辅导时间:另定地点:软件中心(语音楼8楼)答辩检查时间:18周星期五上午8:00起1. Huffman编解码(1人)要求: a. 随机输入一段英文(含标点、空格以及大小写的区分,标点仅限逗号“,”和句点“.”);b. 统计各种符号出现的频度;c. 进行Huffm...

weixin_39572152的博客 882

元宇宙通证- 九、IT/ICT发展史全景长图

九、IT/ICT发展史全景长图 (一)综述 IT是Information Technology的缩写,意为”信息技术“,包含现代计算机、网络、通信等信息领域技术。自1844年人类历史上发出来第一份电报,实现了信息的长图传输,信息技术发展的历史大幕随之拉开。信息技术的普遍应用,是进入信息社会的标志。 IT技术最早发源于半导体,然后发展处计算机、通信网和互联网,进而演进到现在的AI、XR、计算机、大数据、物联网、工业互联网、区块链、量子计算等。 有人说元宇宙是下一代互联网,有人说元宇宙是互联网的终极形态。 我们

沧海之巅的专栏 1万+

Ubuntu-22.04安装VMware虚拟机并安装Windows10

最近在研究虚拟机,主要集中在KVM、Virtualbox和VMware这三种虚拟机上。前面我已经研究了前两种虚拟机的安装和使用方式,这篇文章介绍3兄弟中最后一个虚拟机安装和使用方式。Virtualbox虚拟机安装和使用KVM虚拟机安装和使用相比于前两种,VMware的安装方式最麻烦,但是综合体验下来我感觉流畅度最好。如果你确实有在Linux上使用VMware虚拟机的需求,那不妨跟着我看下去吧。1、gcc版本和内核版本一定要匹配上,否则会出各种错误。

jiexijihe945的博客 4118

字符串权值

给定一个仅包含26个英文字母(大小写不敏感)的字符串,每个字母都有一个对应的权值,而整个字符串的权值就是字符串中每个字母对应权值的总和。请你写个程序求出字符串的权值,简单吧,快来A掉这道题。之后t组测试数据,每组测试数据有两行输入,第一行是26个用空格间隔的数字,按照顺序分别代表a-z(大小写不敏感)这26个字母的权值。第二行是一个由英文字母组成的字符串,即待求出权值的字符串。测试数据保证单个字母对应的权值大于等于0且不超过int型数据范围,单个字符串的长度不超过10000。

lisads的博客 1165

Linux内核进程管理子系统有什么第五十一回 —— 进程主结构详解(47)

Linux内核进程管理子系统有什么第五十一回 —— 进程主结构详解(47)

phmatthaus的专栏 1386

51nod 1277 字符串中的最大值 题解

题意简述 给定一个长度<=1e5<=1e5<=1e5的字符串SSS,请你求出SSS所有前缀中,出现次数乘以前缀长度的最大值。 思路框架 求一遍nextnextnext然后dp[next[i]]+=dp[i]dp[next[i]]+=dp[i]dp[next[i]]+=dp[i],求i×dp[i]i\times dp[i]i×dp[i]的最大值。 具体思路 前缀的出现次数?KMPK...

LightningUZ的博客 294

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Kmp求字符串前缀在字符串出现的次数】51nod 1277 字符串中的最大值

#include #include #include using namespace std; typedef long long LL; /* 51nod 1277 字符串中的最大值 求前缀在字符串出现的次数 (num[i]) num[nex[i]] += num[i]; */ const int N = 100010; char s[N]; int nex[N]; void getn

学无纸巾 629

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

51NOD 1277 字符串中的最大值 【拓展KMP】

1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。

LuRiCheng的博客 526

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

51nod1277 字符串中的最大值【KMP】

一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。 例如:S = “abababa” 所有的前缀如下: “a”, 长度与出现次数的乘积 1 * 4 = 4, “ab”,长度与出现次数的乘积 2 * 3 = 6, “aba”, 长度与出现次数的乘积 3 * 3 = 9, ...

weixin_43438700的博客 378

51Nod 1277 字符串中的最大值(KMP + DP)

题意:给你一个字符串,然后让你找该字符串 的前缀出现次数 * 长度的最大值。 思路:KMP + dp。 先KMP求出next数组。设dp[i] 代表 i长度的 前缀出现的次数。 那么 对应着 i 有 dp[ next[i] ] += dp[i] 因为 Next数组的含义 是非前缀的后缀子串 与该字符串前缀 匹配的 最大长度,即对应着Next[i],如果Next[i] 不等于0 的话,...

一身清贫怎敢入繁华 450

(kmp)51nod 1277 字符串中的最大值

i从后往前,前缀长度为next[i]的字符串说明在此时出现过一次,累加上   #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; #include &lt;cstdio&gt; #include &lt;queue&gt; #include &lt;stack&gt; #include &...

qq_41758381的博客 228

51nod 1277 字符串中的最大值 kmp法

复健中… 题目重点在求出现的次数,这个可以用SA,SAM求,讨论区有SA的解法。相对而言kmp较为简便,只要理解kmp中next数组的定义,就能轻松解决,倒着操作累计叠加即可。 需要注意的是边界问题,由于未被赋值的next数组默认为0,所以如果计数的数组从0开始就会累加过多,所以将1作为初始位置,也因此做kmp的时候记得往后多做一位。 不过就算位置错了也只有三个点不过。。 #include<cstdio> #include<cstring> #include<algorithm

老臣 336

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

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

87

51nod 1277 字符串中的最大值【KMP算法】【next树】

Description一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。 例如:S = “abababa” 所有的前缀如下:“a”, 长度与出现次数的乘积 1 * 4 = 4, “ab”,长度与出现次数的乘积 2 * 3 = 6, “aba”, 长度与出现次数的

Sdywolf的博客 582

KMP——51nod1277 字符串中的最大值

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277 标算Kmp啦 题目中让我们求的前缀出现次数是可以用Kmp中的nex数组推出来的 就是当前i的border长度可以累加到nex[i]的次数答案中 所以我们先求出字符串的nex数组(border),然后倒推答案(sum[nex[i]]+=sum[i]) 最后输

2333:jzqjzq的博客专栏 552

【51nod 1277】:字符串中的最大值 KMP

传送门 分析 考虑KMPKMPKMP算法中¥next数组的意义,如果数组的意义,如果数组的意义,如果next[i] = 0$,表示1−i1 - i1−i这一段字符串是唯一的前缀 所以,我们用sum[i]sum[i]sum[i]表示长度为iii的前缀出现的次数,那么可以写出递推式sum[ne[i]+=sum[i]sum[ne[i] += sum[i]sum[ne[i]+=sum[i] 代码 #pragma GCC optimize(3) #include <bits/stdc++.h> #defi

tlyzxc的博客 271

51nod——1277 字符串中的最大值

一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。 例如:S = "abababa" 所有的前缀如下: "a", 长度与出现次数的乘积 1 * 4 = 4, "ab",长度与出现次数的乘积2 * 3 = 6, "aba",长度与出...

didai0291的博客 118

【51Nod】1277 字符串中的最大值-KMP

题意 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。 题解 kmp的nxt建成一棵树,子树大小就是出现次数QWQ 太妙啦 ac自动机MLE了… 代码 #include&amp;lt;bits/stdc++.h&amp;gt; using namespa...

远行客 293
上一篇: 蓝书(算法竞赛进阶指南)刷题记录——POJ1961 Period(KMP算法)
下一篇: 【NOI2014】BZOJ3670动物园题解(KMP算法)
hezlik
博客等级 码龄9年 111粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值