CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】

正题

题目链接:https://www.luogu.com.cn/problem/CF1286E


题目大意

定义一个字符串sss的权值为对于每个sL∼R=s1∼R−L+1s_{L\sim R}=s_{1\sim R-L+1}sLR=s1RL+1的区间,会产生min⁡i=LRwi\min_{i=L}^Rw_imini=LRwi的贡献。

现在开始时sss为空串,nnn次往sss后加入一个字符和往www序列加入一个数字,然后求这个串的贡献。

强制在线

1≤n≤6×105,1≤wi<2301\leq n\leq 6\times 10^5,1\leq w_i<2^{30}1n6×105,1wi<230


解题思路

我们在每次加入字符后考虑所有后缀的贡献,然后考虑加入一个字符后后缀产生贡献的变化。

一个想法是对于原来的后缀[n−len,n−1][n-len,n-1][nlen,n1],如果slen+1=sns_{len+1}=s_nslen+1=sn,那么新的后缀[n−len,n][n-len,n][nlen,n]就会产生贡献,否则就不会。除了这些以外还有如果s1=sns_1=s_ns1=sn那么后缀[n,n][n,n][n,n]也会产生贡献。

也就是一次操作最多增加一个会产生后缀的贡献,我们取考虑怎么维护其他以前的后缀。

权值方面比较简单,[n−len,n−1][n-len,n-1][nlen,n1]的贡献转到[n−len,n][n-len,n][nlen,n]的贡献无非就是对wiw_iwimin⁡\minmin,也就是我们要一个能支持加入删除全部取minminmin的数据结构。其实暴力维护都行,我们用map记录贡献为kkk的后缀有多少个,然后每次暴力把大于wiw_iwi的都修改掉即可,这样势能分析一下就知道是对的。

现在第二个问题是我们怎么知道每次要删除的后缀是哪些。我们建立出KMP的failfailfail树,那么原本产生贡献的后缀肯定都在n−1n-1n1点到根节点的路径上,我们维护一个lasi,clas_{i,c}lasi,c表示节点iii往祖先走的路上遇到的第一个xxx满足sx+1=cs_{x+1}=csx+1=cxxx,然后我们就可以一直往上走找到要删除的后缀了。

RMQRMQRMQ维护一下后缀的贡献即可。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const ll N=6e5+10,mod=1e18;
ll n,lg[N],nxt[N],las[N][26],ans;
char s[N];map<ll,ll> mp;int f[N][20];
pair<ll,ll> sum;
pair<ll,ll> operator+(const pair<ll,ll> &x,const ll &y)
{return make_pair((x.first+y)%mod,x.second+(x.first+y)/mod);}
ll operator%(const pair<ll,ll> &x,const ll &p)
{return (x.first%p+(x.second%p)*(mod%p)%p)%p;}
void print(pair<ll,ll> x)
{if(x.second) printf("%lld%018lld\n",x.second,x.first);else printf("%lld\n",x.first);
}
ll Ask(ll l,ll r){ll z=lg[r-l+1];return min(f[r][z],f[l+(1<<z)-1][z]);
}
signed main()
{scanf("%lld",&n);for(ll i=2;i<=n;i++)lg[i]=lg[i>>1]+1;ll mask=(1ll<<30),z=0;char op[2];ll w=0;scanf("%s%lld",op,&w);mp[w]++;ans=sum.first=w;s[1]=op[0];f[1][0]=w;printf("%lld\n",ans);for(ll p=2;p<=n;p++){scanf("%s%lld",op,&w);char c=op[0];c=(c-97+sum%26)%26+97;s[p]=c;w=w^(sum%mask);f[p][0]=w;for(ll i=1;(1<<i)<=p;i++)f[p][i]=min(f[p][i-1],f[p-(1<<i-1)][i-1]);while(z&&s[z+1]!=s[p])z=nxt[z];nxt[p]=(z+=(s[z+1]==s[p]));for(ll j=0;j<26;j++)las[p][j]=las[nxt[p]][j];las[p][s[nxt[p]+1]-'a']=nxt[p];for(ll j=0;j<26;j++){if(j+'a'==c)continue;for(ll x=las[p-1][j];x;x=las[x][j]){ll val=Ask(p-x,p-1);mp[val]--;ans=ans+(-val);}}while(mp.size()){map<ll,ll>::iterator it=mp.end();it--;pair<ll,ll> x=*it;if(x.first>w){ans=ans+(-(x.first-w)*x.second);mp[w]+=x.second;mp.erase(it);}else break;}if(s[p]==s[1])mp[w]++,ans=ans+w;sum=sum+ans;print(sum);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板:二维凸包(计算几何)

所谓凸包&#xff0c;就是一个凸出来的包 &#xff08;逃&#xff09; 前言 计算集合的第一课。 关键特征&#xff1a;周长最小。此时一定是凸包。 解析 定义 凸包&#xff1a;在平面上能包含所有给定点的最小凸多边形叫做凸包。 性质&#xff1a;凸包的周长是所有能包含给…

[AtCoder Beginner Contest 215] A-G题解

文章目录A - Your First JudgeB - log2(N)C - One More aab aba baaD - Coprime 2E - Chain ContestantF - Dist Max 2G - Colorful Candies 2atcoder题目链接 A - Your First Judge 签到题 #include <cstdio> #include <iostream> using namespace std; string…

Acwing 135 最大子序和

Acwing 135 最大子序和 题目&#xff1a; 输入一个长度为 n 的整数序列&#xff0c;从中找出一段长度不超过 m 的连续子序列&#xff0c;使得子序列中所有数的和最大。 题解&#xff1a; 我们把这个问题的集合分成n份&#xff0c;第k份表示以A[k]结尾的最大连续子序列是多少…

.net core自定义高性能的Web API服务网关

网关对于服务起到一个统一控制处理的作用&#xff0c;也便于客户端更好的调用&#xff1b;通过网关可以灵活地控制服务应用接口负载&#xff0c;故障迁移&#xff0c;安全控制&#xff0c;监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格&#xff0c;所以针对业…

微软宣布 Visual Studio 2019 将于4月2日正式发布

微软于去年发布了 Visual Studio 2019 预览版。今天&#xff0c;该公司宣布 Visual Studio 2019 正式版将于4月2日发布。微软在公告中表示&#xff1a;“欢迎加入我们在4月2号当天举办的 VS 2019 线上发布活动&#xff0c;这是一款更加现代化、创新且实用的生产力工具”。据悉&…

CF1427F-Boring Card Game【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1427F 题目大意 有一个1∼6n1\sim 6n1∼6n的序列&#xff0c;两个人轮流操作&#xff0c;每次取走连续的三个数字。 现在给出先手取走的数字集合&#xff0c;要求构造方案。 保证有解 1≤n≤2001\leq n\leq 2001≤n≤200…

模板:旋转卡壳(计算几何)

所谓旋转卡壳&#xff0c;就是旋转起来的卡壳 &#xff08;逃&#xff09; 前言 前置知识&#xff1a;凸包 个人感觉很像 two-pointers 算法。 能够在优秀的线性时间复杂度内完成总多求最值&#xff08;周长、面积…&#xff09;的神奇操作。 解析 给出情境&#xff1a; 给…

Acwing 1088.旅行问题

Acwing 1088.旅行问题 题目&#xff1a; 一个环形公路&#xff0c;由n个车站&#xff0c;每个站有若干升汽油&#xff08;有的站可能油量为零&#xff09;&#xff0c;每升油可以让汽车行驶一千米。 从某个车站出发&#xff0c;一直按顺时针&#xff08;或逆时针&#xff09;…

[AtCoder Regular Contest 125] A-F全题解

文章目录A - Dial UpB - SquaresC - LIS to Original SequenceD - Unique SubsequenceE - SnackF - Tree Degree Subset Sum网址链接A - Dial Up 签到题 特判一下有没有0/1在目标串中出现而没在原串出现 除了第一次0/1数字互换时&#xff0c;需要从a1a_1a1​左右找距离最近的…

DotNetty 实现 Modbus TCP 系列 (三) Codecs Handler

DotNetty 实现 Modbus TCP 系列 (一) 报文类DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例DotNetty 作为一个半成品&#xff0c;我们不需要关注细节的实现&#xff0c;只需要关注自己的业务即可&#xff0c;所以最主要的就是处理 Codecs 和 Handler。所有…

loj#2788-「CEOI2015 Day1」管道【树上差分】

正题 题目链接:https://loj.ac/p/2788 题目大意 给出nnn个点mmm条边的一张图&#xff0c;求它的所有割边。 1≤n≤105,1≤m≤61061\leq n\leq 10^5,1\leq m\leq 6\times 10^61≤n≤105,1≤m≤6106&#xff0c;内存限制16MB 解题思路 我们存不下所有的边&#xff0c;但是nnn很…

Acwing -- 单调队列优化的DP问题

文章目录引入acwing154 滑动窗口应用135 最大子序和1088.旅行问题AcWing 1087. 修剪草坪28AcWing 1089. 烽火传递AcWing 1090. 绿色通道AcWing 1091. 理想的正方形引入 acwing154 滑动窗口 题目链接 题解 应用 闫氏最优化问题分析法 135 最大子序和 题目&#xff1a; 输入…

模板:半平面交(计算几何)

所谓半平面交&#xff0c;就是和“半平先生”当面交谈。顾名思义&#xff0c;这是一个源于日本的算法。 &#xff08;逃&#xff09; 前言 感觉应用很灵活的一个算法&#xff0c;一切有两个变量的线性规划问题都可以转化为半平面交。 有时可能要注意取等问题&#xff08;指射…

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) A-F全题解

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 文章目录A. Simply Strange SortB. Charmed by the GameC. Deep Down BelowD1/D2. Up the StripE. Bottom-Tier ReversalsF. Top-Notch InsertionsA. Simply Strange Sort 签到题&#xff0c;暴力做 …

[小技巧]C#中如何为枚举类型添加描述方法

背景在我们的日常开发中&#xff0c;我们会经常使用枚举类型。有时我们只需要显示枚举的值或者枚举值对应名称&#xff0c; 但是在某些场景下&#xff0c;我们可能需要将枚举值显示为不同的字符串。例&#xff1a; 当前我们有如下枚举Level这个枚举有4个可选值B, N, G, VG。 现…

Loj#3320-「CCO 2020」旅行商问题

正题 题目链接:https://loj.ac/p/3320 题目大意 有一张nnn个点的无向完全图&#xff0c;每一条边是红色或者蓝色&#xff0c;对于每个点sss求从这个点出发的一条尽量短的经过所有点的路径。 1≤n≤20001\leq n\leq 20001≤n≤2000 解题思路 显然地猜测一下最短的长度肯定是n…

AcWing 1087. 修剪草坪28

AcWing 1087. 修剪草坪 题意: 有n个数&#xff0c;不能选超过连续的k个数&#xff0c;问所能选的最大值是多少&#xff1f; 题解&#xff1a; 我们首先分析dp过程&#xff1a; dp[i]表示选择完前i个数的最大值 sum[i]表示前i项和 对于第i个数&#xff0c;它有两个情况&#…

洛谷P4463:calc(dp、拉格朗日插值)

Solution\text{Solution}Solution 神奇题目。 首先可以强制所有的数递增&#xff0c;最后的答案乘一个 n!n!n! 即可。 设 dpi,jdp_{i,j}dpi,j​ 表示在 [1,j][1,j][1,j] 的值域选了 iii 个数的答案&#xff0c;不难写出 dp 转移&#xff1a; dpi,jdpi−1,j−1jdpi,j−1dp_{i,j…

CF1710C-XOR Triangle【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1710C 题目大意 求有多少对0≤a,b,c≤n0\leq a,b,c\leq n0≤a,b,c≤n满足axorb,axorc,bxorca\ xor\ b,a\ xor\ c,b\ xor\ ca xor b,a xor c,b xor c作为边长时能构成一个非退化三角形。 n以二进制形式给出 1≤n<221051…

工业通信的开源项目 HslCommunication 介绍

前言&#xff1a;本项目的孵化说来也是机缘巧合的事&#xff0c;本人于13年大学毕业后去了一家大型的国企工作&#xff0c;慢慢的走上了工业软件&#xff0c;上位机软件开发的道路。于14年正式开发基于windows的软件&#xff0c;当时可选的技术栈就是MFC和C#的winform&#xff…