P4070-[SDOI2016]生成魔咒【SA,平衡树】

正题

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


题目大意

长度为nnn的字符串,对于每个iii求字符串1∼i1\sim i1i部分有多少个不同的子串。


解题思路

对于整个串ans=∑i=1nn−i+1−heightians=\sum_{i=1}^nn-i+1-height_ians=i=1nni+1heighti,考虑如何维护heightheightheight
往末尾加上一个字符会对heightheightheight造成很大影响,但是如果在字符串前面加上一个heightheightheight的话就不会对其他heightheightheight造成影响了。

所以先翻转字符串,问题变为每次在前面加上一个字符。

首先离线后缀排好序,然后每次加入一个字符时,我们用平衡树找已经插入的前驱和后继然后用STSTST表来求到他们的LCPLCPLCP(也就是更新后的heightheightheight)即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=1e5+10;
int n,m,a[N],b[N],height[N],lg[N];
int c[N],sa[N],rk[N],x[N],y[N];
int f[20][N];long long ans;
set<int> s;
void Qsort(){for(int i=1;i<=m;i++)c[i]=0;for(int i=1;i<=n;i++)c[x[i]]++;for(int i=1;i<=m;i++)c[i]+=c[i-1];for(int i=n;i>=1;i--)sa[c[x[y[i]]]--]=y[i],y[i]=0;return;
}
void SA(){for(int i=1;i<=n;i++)x[i]=a[i],y[i]=i;Qsort();for(int w=1;w<=n;w<<=1){int p=0;for(int i=n-w+1;i<=n;i++)y[++p]=i;for(int i=1;i<=n;i++)if(sa[i]>w)y[++p]=sa[i]-w;Qsort();swap(x,y);p=x[sa[1]]=1;for(int i=2;i<=n;i++)x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+w]==y[sa[i-1]+w])?p:++p;if(p==n)break;m=p;}return;
}
void Get_Height(){int k=0;for(int i=1;i<=n;i++)rk[sa[i]]=i;for(int i=1;i<=n;i++){if(rk[i]==1)continue;if(k)k--;int j=sa[rk[i]-1];while(i+k<=n&&j+k<=n&&a[i+k]==a[j+k])k++;height[rk[i]]=k;}return;
}
void RMQ(){lg[0]=-1;for(int i=1;i<=n;i++)lg[i]=lg[i/2]+1,f[0][i]=height[i];for(int i=1;i<19;i++)for(int j=1;j+(1<<i-1)<=n;j++)f[i][j]=min(f[i-1][j],f[i-1][j+(1<<i-1)]);return;
}
int LCP(int l,int r){l++;int z=lg[r-l+1];return min(f[z][l],f[z][r+1-(1<<z)]);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}sort(b+1,b+1+n);m=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+m,a[i])-b;for(int i=1;i<=n/2;i++)swap(a[i],a[n-i+1]);SA();Get_Height();RMQ();for(int i=n;i>=1;i--){s.insert(rk[i]);set<int>::iterator it=s.find(rk[i]);int k=0;if(it!=s.begin()){int p=*(--it);k=LCP(p,rk[i]);++it;}++it;if(it!=s.end()){int p=*it;k=max(k,LCP(rk[i],p));}ans+=n-i+1-k;printf("%lld\n",ans);}
}

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

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

相关文章

ASP.NET Core 2.1 使用Docker运行

1.新建一个 ASP.NET Core 2.1 项目然后运行一下项目&#xff0c;确保我们刚刚建立的项目可以正常运行。2.编写 Dockerfile新建一个文本文件&#xff0c;命名为 DockerfileFROM microsoft/dotnet:2.1-aspnetcore-runtimeWORKDIR /appCOPY . .EXPOSE 80ENTRYPOINT ["dotnet&…

【DP】和谐的奶牛(jzoj 1750)

和谐的奶牛 题目大意&#xff1a; 有一些括号&#xff08;保证是合法的&#xff0c;合法&#xff1a;每一个左括号都有自己配对的有括号&#xff09;&#xff0c;现在要将这些括号分为两组&#xff08;其中一组可以为空&#xff09;&#xff0c;分完组后括号的顺序要和原来的…

费用流-Wannafly Day2 TwoGraph-神题

TwoGraph 题意 题解 这真是一道神题,这题有两点比较难想,其中第一点是最难想的. 我们先考虑只有一张图的情况. 性质: [1]如果给每个点匹配一条边,形成一个(点,边)(点,边)(点,边)对,其中点不能重复出现,边也不能重复出现.那么这些对形成的图的联通块要么是树,要么是环套树. 证…

ASP.NET Core Web API 与 SSL

SSL一直没有真正研究过SSL&#xff0c;不知道下面的理解是否正确。SSL是Secure Sockets Layer的缩写&#xff0c;它用来保护服务器和客户端之前的通信。它是基于信任加密的概念。在介绍SSL的原理之前&#xff0c;首先介绍一下加密&#xff08;Encryption&#xff09;的概念。刷…

P5662-纪念品【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5662 题目大意 有TTT天&#xff0c;nnn个纪念品&#xff0c;每个纪念品每天的价格不同&#xff0c;数量不限。开始小明有mmm块钱&#xff0c;求最后一天的最多钱。 解题思路 因为一个纪念品可以一天卖出并且一天买入&#…

【模拟】聊天服务器的外部流量

聊天服务器的外部流量 题目大意&#xff1a; 有一个通讯系统&#xff0c;可以将某人邀请进来&#xff08;name&#xff09;&#xff0c;也可以将某人T出去&#xff08;-name&#xff09;&#xff0c;也可以向群中的所有人发一条信息&#xff08;name&#xff1a;…&#xff0…

线段树-Pudding Monster CF526F-单调栈

Pudding Monster 题目连接:https://www.luogu.org/problem/show?pidCF526F 问题提出 给长度为nnn的排列AAA.问有多少(l,r)(l,r)(l,r),使得将Al,Al1,...,ArA_l,A_{l1},...,A_rAl​,Al1​,...,Ar​排序之后是连续的一段数.n≤105n \le 10^5n≤105 问题解决 判断一段区间是否…

P5664-Emiya家今天的饭【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5664 题目大意 对于nnn个方法&#xff0c;mmm个材料&#xff0c;一个方法配对一个材料可以做an,ma_{n,m}an,m​道菜。选择kkk个配对要求 配对至少为k>1k>1k>1每个配对的方法不同每个材料最多用⌊k2⌋\lfloor\frac…

GitHub宣布GitHub Education 新计划,学校可免费用企业版

今天 GitHub 宣布面向所有学校和教育机构开放 GitHub Education&#xff0c;方便学生和老师免费使用 GitHub 企业版功能&#xff0c;以及学生开发者工具包、GitHub 教室、培训等资源。2014 年&#xff0c;GitHub 推出了学生开发者工具包&#xff0c;其中包括 Azure 等云服务、G…

【dfs】聚会

聚会 题目大意&#xff1a; 有一些树&#xff0c;求深的树的深度 原题 解题思路&#xff1a; 从一个根出发&#xff0c;dfs往下搜 代码&#xff1a; #include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,t,g,w,ans,c[2…

P3960-列队【权值线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P3960 题目大意 n∗mn*mn∗m的队列&#xff0c;起初站在第(i,j)(i,j)(i,j)位置的人编号是(i−1)∗nj(i-1)*nj(i−1)∗nj。然后每次选择一个人出队后所有人向左补齐后所有人向前补齐&#xff0c;然后刚刚出列的那个人入队。 求…

2018 大湾区(深圳) .NET技术分享交流会 第一期

.NET Core 2.1 已于2018年5月30日正式发布&#xff0c;邀请粤港澳大湾区.NET技术专家和从业人员&#xff0c;一起分享与交流.NET技术的发展方向&#xff0c;提高粤港澳大湾区.NET技术交流氛围&#xff0c;挖掘.NET高级人才&#xff0c;为改善.NET生态系统贡献力量&#xff0c;使…

线段树-Mex-洛谷P4137

Mex 问题提出 有一个长度为nnn的数组{a1,a2,…,an}\{a_1,a_2,…,a_n\}{a1​,a2​,…,an​}。mmm次询问&#xff0c;每次询问一个区间内最小没有出现过的自然数。 题目解答 对1−n1-n1−n这里能够的每个数xxx,都统计出来在数组中出现的位置,并在前补上000,在后补上n1n1n1. …

卡车

卡车 题目大意&#xff1a; 有一个卡车向里面放东西&#xff08;重量要么是一要么是二&#xff09;&#xff0c;价值不同&#xff0c;放的东西的价值之和最大是多少 原题&#xff1a; 解题思路&#xff1a; 看看数据就知道DP会MLE&#xff0c;所以要用排序来做&#xff0c;…

P2831-愤怒的小鸟【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2831 题目大意 nnn个点&#xff0c;每次可以射掉在函数yax2bxyax^2bxyax2bx上的点&#xff08;a,ba,ba,b自定但是要求a<0a<0a<0&#xff09;。求最少射击次数。 解题思路 考虑状压&#xff0c;我们发现如果一次射掉…

初一级模拟赛总结(3.15)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf220220220100100100100100100000202020222fyfyfy150150150000100100100000505050333lthlthlth120120120100100100202020000000444hkyhkyhky100100100000100100100000000444tjhtj…

从明面上学习ASP.NET Core

一、前言这篇文章就是从能看到地方去学习Core&#xff0c;没有很深奥&#xff0c;也没有很难懂&#xff0c;现在我们开始吧。二、构建项目&#xff0c;引发思考创建项目的步骤真的很简单&#xff0c;你要是不会&#xff0c;我真也没法了&#xff0c;我这是创建的MVC的项目。接下…

线段树-区间的交

区间的交 题目来源 孙耀峰Segment_Tree.pdf 原创 题目描述 给定nnn个区间,[li,ri][l_i,r_i][li​,ri​],可以选出其中一些区间,设选出tottottot个,令xxx表示这tottottot个区间交的长度.求min{x,tot}min\{x,tot\}min{x,tot}n≤105,1≤xi≤yi≤nn \le 10^5,1 \le x_i \le y_i…

【DP】收银员

收银员 题目大意&#xff1a; 有n件物品&#xff0c;每件物品有他的扫描时间和价格&#xff0c;在扫描的时候可以偷物品&#xff08;一个单位时间偷一件&#xff09;&#xff0c;问最少给多少钱 原题&#xff1a; 解题思路&#xff1a; 设f[j]为偷或买共j件花的最少钱&…

P5020-货币系统【背包】

正题 题目链接:https://www.luogu.com.cn/problem/P5020 题目大意 定义S(A)S(A)S(A)表示集合AAA内的若干个数字和&#xff08;可以重复使用&#xff09;可以表示的集合 nnn个数的集合FFF&#xff0c;求一个最小的集合G⊆FG\subseteq FG⊆F且S(F)S(G)S(F)S(G)S(F)S(G)。 解题思…