CF1063F-String Journey【SAM,线段树】

正题

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


题目大意

给出一个字符串,求选出kkk个不交子串满足按照起始位置排序后,满足下一个是上一个的真子串。

kkk的最大值。

1≤n≤5×1051\leq n\leq 5\times 10^51n5×105


解题思路

首先我们肯定是从短串考虑到长串的,为了方便我们先把字符串翻转一下。

然后考虑一个性质,肯定存在一个最优解的字符串集合是长度每次增加111的,显然因为如果增加超过111,我们统一删掉这个位置往后的字符串的一段后缀也是合法的。

那么现在长度和答案就可以统一了,设fif_{i}fi表示以iii结尾的前缀(且最后一个串也以iii结尾)的答案。

那么对于一个fif_ifi答案的字符集我们把每个串的最后一个字符删去,可以作为fi−1f_{i-1}fi1的答案,所以有fi−1≥fi−1f_{i-1}\geq f_{i}-1fi1fi1,也就是fif_ifi每次最多增加111,那么我们现在就可以暴力处理每个fif_ifi可能的取值了。

至于一个fi=xf_i=xfi=x时该如何判断答案是否正确,也就是字符串[i−x+1,i][i-x+1,i][ix+1,i]能否作为答案,因为子串集长度是每次加111的,所以上一个只有可能是[i−x+2,i][i-x+2,i][ix+2,i]或者[i−x+1,i−1][i-x+1,i-1][ix+1,i1],我们只需要考虑所有这些串的答案就好了。考虑用SAM,对于每个处理出来的答案fif_ifi我们可以加入到posipos_iposi(也就是前缀[1,i][1,i][1,i]对应的SAMSAMSAM节点处),然后查询时直接查询子串[l,r][l,r][l,r]对应节点子树内的最大fif_ifi即可(因为显然fif_ifi能做到的fi−1f_{i}-1fi1也能做到,所以我们只需要查询后缀相同的最大值即可)

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


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e6+10,R=20;
int n,pos[N],f[N][R],g[N],rfn[N],ed[N];
int cnt,last,fa[N],len[N],ch[N][26];
char s[N];vector<int> G[N];
struct SegTree{int w[N<<2];void Change(int x,int L,int R,int pos,int val){if(L==R){w[x]=max(w[x],val);return;}int mid=(L+R)>>1;if(pos<=mid)Change(x*2,L,mid,pos,val);else Change(x*2+1,mid+1,R,pos,val);w[x]=max(w[x*2],w[x*2+1]);return;}int Ask(int x,int L,int R,int l,int r){if(L==l&&R==r)return w[x];int mid=(L+R)>>1;if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return max(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r));}
}T;
void Ins(int c){int p=last,np=last=++cnt;len[np]=len[p]+1;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{int q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{int nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=fa[np]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}return;
}
void dfs(int x){rfn[x]=++cnt;for(int i=0;i<G[x].size();i++)f[G[x][i]][0]=x,dfs(G[x][i]);ed[x]=cnt;return;
}
int getf(int x,int l){for(int i=R-1;i>=0;i--)if(len[f[x][i]]>=l)x=f[x][i];return x;
}
bool check(int i){int x=getf(pos[i],g[i]-1);if(T.Ask(1,1,cnt,rfn[x],ed[x])>=g[i]-1)return 1;x=getf(pos[i-1],g[i]-1);if(T.Ask(1,1,cnt,rfn[x],ed[x])>=g[i]-1)return 1;return 0;
}
int main()
{scanf("%d",&n);scanf("%s",s+1);reverse(s+1,s+1+n);cnt=last=1;for(int i=1;i<=n;i++)Ins(s[i]-'a'),pos[i]=last;for(int i=2;i<=cnt;i++)G[fa[i]].push_back(i);cnt=0;dfs(1);for(int j=1;j<R;j++)for(int i=1;i<=cnt;i++)f[i][j]=f[f[i][j-1]][j-1];int z=1,ans=0;for(int i=1;i<=n;i++){g[i]=g[i-1]+1;while(g[i]>1&&!check(i)){T.Change(1,1,cnt,rfn[pos[z]],g[z]);g[i]--;z++;}ans=max(ans,g[i]);}printf("%d\n",ans);return 0;
}

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

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

相关文章

CF1406D:Three Sequences(贪心、构造)

解析 本题说明了样例的重要性 完全可以通过仔细观察样例得出一些结论 首先最大值显然就是max⁡(b1,cn)\max(b_1,c_n)max(b1​,cn​) 考虑最优策略 如果a上升了&#xff0c;就让b上升 因为假设前面都拼的严丝合缝了&#xff0c;让c上升前面全得上升&#xff0c;肯定会对答案有…

在.NET Core中使用Exceptionless分布式日志收集框架

一.Exceptionless简介Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web Api&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;MVC 等技术栈的应用程序中&#xff0c;并且提供了…

YbtOJ-选点构形【欧拉函数】

正题 题目链接:https://www.ybtoj.com.cn/contest/351/problem/1 题目大意 一个圆上&#xff0c;你需要在3∼n3\sim n3∼n中选出kkk个作为aia_iai​&#xff0c;然后再圆上选择最少的点使得对于每个aia_iai​你都能用选出的点连成一个正aia_iai​边形。 k2≤n≤106k2\leq n\l…

CF1406E:Deleting Numbers(构造、根号分块)

解析 打表发现1e5以内的质因子是9592个 就是它没错了 容易想到枚举因子判断答案是否异常来判断是否包含该质因子 但是这个方法在最小质因子处是不奏效的 那么如何找到最小的质因子呢&#xff1f; 考虑把所有的质因子分成m\sqrt mm​块 然后每扫完一块&#xff0c;问一下 (A,…

test1 3-15 模拟赛1

文章目录考试复盘matrixsetstring考试复盘 首先先说T1T1T1&#xff0c;嗯&#xff0c;发现了列是相互独立的&#xff0c;所以分开考虑了 但是实在没想到线性基&#xff0c;就顺着自己的思路硬搞了505050跑路 老实说&#xff0c;505050分的部分分写得都是迷迷糊糊的&#xff0c;…

华为云提供针对Nuget包管理器的缓存加速服务测试

在Visual Studio 2013、2015、2017中&#xff0c;使用的是Nuget包管理器对第三方组件进行管理升级的。而且 Nuget 是我们使用.NET Core的一项基础设施&#xff0c;.NET的软件包管理器NuGet.org是一项面向全球用户搭建的服务&#xff0c;不论用户身在何处&#xff0c;NuGet.org都…

Consumer

Consumer 题意&#xff1a; n个游戏机&#xff0c;有w钱 每个游戏机上有游戏&#xff0c;每个游戏有价格和娱乐值&#xff0c;游戏机有价格&#xff0c;没有娱乐值&#xff0c;玩游戏必须要用对应的游戏机&#xff0c;问娱乐值最大是多少 题解&#xff1a; 有依赖关系的背包…

Loj#6405-「ICPC World Finals 2018」征服世界【模拟费用流,左偏树】

正题 题目链接:https://loj.ac/p/6405 题目大意 给出nnn个点的一棵树&#xff0c;每个点有xix_ixi​个军队&#xff0c;需要yiy_iyi​个军队&#xff0c;你可以移动军队&#xff0c;求使得满足所有点要求的情况下&#xff0c;军队移动路径和的最小值。 1≤n≤2500001\leq n\l…

兰道定理(竞赛图)

所谓兰道定理&#xff0c;就是兰道定下的道理 &#xff08;逃&#xff09; 解析 每条边被规定了方向的完全图叫做竞赛图 竞赛图中&#xff0c;设每个点的出度为uiu_iui​ 显然有&#xff1a; ∑uin(n−1)2\sum u_i\dfrac{n\times(n-1)}{2}∑ui​2n(n−1)​ 而兰道定理的内容是…

test2 3-16 2021 模拟赛two

文章目录考试复盘染色问题芬威克树礼物考试复盘 先说T1T1T1 染色&#xff0c;以为是道数学题&#xff0c;推了有一会儿的公式&#xff0c;从颜色1到颜色m&#xff0c;感觉是dpdpdp转移 发现颜色重叠的方案可以转化为另外一种相邻不重叠的染色 但是推到颜色4的时候就发现自己…

ASP.NET Core 2.2 : 扒一扒新的Endpoint路由方案

ASP.NET Core 从2.2版本开始&#xff0c;采用了一个新的名为Endpoint的路由方案&#xff0c;与原来的方案在使用上差别不大&#xff0c;但从内部运行方式上来说&#xff0c;差别还是很大的。上一篇ASP.NET Core;图解路由(2.1 earler)详细介绍了原版路由方案的运行机制&#xff…

郊区春游题解

郊区春游 题意&#xff1a; 给定一张图&#xff0c;求从某个起点出发&#xff0c;经过其中R个点&#xff08;R个点给出&#xff09;的最短路径&#xff08;每个点经过且只经过一遍&#xff09; 题解&#xff1a; 首先我们用floyed处理出任意两点的距离 dp[i][j]表示当前状态…

2021牛客暑期多校训练营3A-Guess and lies【dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11254/A 题目大意 现在有一个y∈[1,n]y\in[1,n]y∈[1,n]&#xff0c;BobBobBob每次可以选择问AliceAliceAlice是否y≥xy\geq xy≥x&#xff0c;AliceAliceAlice可以说一次谎。BobBobBob要在最少次数内确定yyy的值&#xf…

CF453C:Little Pony and Summer Sun Celebration(dfs、构造)

解析 比较巧妙的一道题 首先做一棵dfs生成树出来 尝试把它的欧拉序列作为答案 但是这样可能会有的地方不符合条件 如果x点的奇偶性不符合&#xff0c;就在序列中加入一个(x,fa) 同时改变x和fa的奇偶性 显然不会超过4*n 如果根需要改奇偶性怎么办&#xff1f; 最后一次回溯删掉…

开源中国 2018 新增开源软件最受欢迎 TOP 50

本周开源中国陆续公布了两个年度榜单&#xff0c;分别是国产新秀榜 TOP 30 和国产新增榜 TOP 50。由于两个榜单的数据来源都是国内开源项目&#xff0c;所以会有部分项目同时出现在两个榜单上。今天公布的这份榜单 —— 开源中国 2018 新增开源软件最受欢迎 TOP 50&#xff0c;…

简单环题解

简单环 题解: 题目求环的情况 如果我们直接枚举会有很多重复&#xff0c;为了避免重复&#xff0c;我们枚举起点&#xff0c;其他的点的序号都必须比起点大&#xff0c;也就是x->y&#xff0c;x一定小于y dp[i][j]表示的是以i的第一个点作为起点的链的数量&#xff0c;j是…

AT2339-[AGC011C]Squared Graph【黑白染色】

正题 题目链接:https://www.luogu.com.cn/problem/AT2339 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;然后有一张nnn\times nnn的图&#xff0c;每个点是一个二元组(a,b)(a,b)(a,b)。(a,b)(a,b)(a,b)和(c,d)(c,d)(c,d)连边当且仅当aaa和ccc有连边&#xff0c;bbb和…

[树链剖分]List wants to travel,Relief grain,hotel加强版,This world need more Zhu

文章目录B&#xff1a;Relief grainC&#xff1a;hotel加强版B&#xff1a;Relief grain 题目 将一段区间修改的标记变成差分&#xff0c;每次都是连续一段的dfndfndfn序修改 从小到大枚举dfndfndfn&#xff0c;在一段标记的最开头的dfndfndfn插入&#xff0c;最末尾的dfndf…

P4342:[IOI1998]Polygon(区间dp)

一道警钟一样的好题 解析 乍一看&#xff1a; “这不就能量项链嘛&#xff0c;这也蓝&#xff1f;” 然后就愉快的WA掉了… qwq 让我们回归本源&#xff0c;在什么时候可以动态规划&#xff1f; “局部最优解可以带动全局最优解的时候&#xff0c;我们可以使用动态规划算法”…

eShopOnContainers 知多少[8]:Ordering microservice

1. 引言Ordering microservice&#xff08;订单微服务&#xff09;就是处理订单的了&#xff0c;它与前面讲到的几个微服务相比要复杂的多。主要涉及以下业务逻辑&#xff1a;订单的创建、取消、支付、发货库存的扣减2. 架构模式如上图所示&#xff0c;该服务基于CQRS 和DDD来实…