洛谷 P5108 仰望半月的夜空 解题报告
P5108 仰望半月的夜空
题目描述
半月的夜空中,寄托了多少人与人之间的思念啊
曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\)
由于思念汇集的过于复杂,因此曦月希望提炼出所有的思念
我们定义\(Y_S(i)\)表示对于字符串\(S\)而言,长度为\(i\)的子串中,字典序最小的,左端点最小的左端点的值
比如对于串\(S = "baa"\),\(Y_S(1) = 2\), \(Y_S(2) = 2\), \(Y_S(3) = 1\)
曦月会告知你\(S\)串,你只需要告诉曦月\(Y_S(i)(1 \le i \le n)\)即可
输入输出格式
输入格式:
第一行,两个参数,分别是\(\sigma \in \{10, 26, 10^7\}\)和\(n\)
如果\(\sigma = 26\),那么第二行将是一个长为\(n\)的小写字母字符串\(S\)
其他情况下,第二行将输入\(n\)个位于\([0, \sigma]\)内的整数
输出格式:
输出一行,第\(i\)个数表示\(Y_S(i)\)的值
说明
\(n\le 300000\)
先考虑维护字典序最小。
首先后缀排序求一下\(sa\)什么的
然后拿一个指针扫描\(sa\)并把长度从小到大枚举,发现\(sa\)指针的移动是单调增的。
但是当前字典序最小可能不在当前点,考虑到从当前点到可以成为答案的点的区间的lcp长度需要大于\(L\),所以我们可以进行二分找到这个右端点。
然后再拿个什么维护一下这个区间内的最下左端点就可以了。
复杂度\(O(n\log n)\)
Code:
#include <cstdio>
#include <algorithm>
const int N=3e5+10;
int tax[N],Rank[N],sa[N],sec[N],h[N],hei[N],lcp[20][N],st[20][N],Log[N];
int typ,n,m,a[N],b[N];char s[N];
void Rsort()
{
for(int i=1;i<=m;i++) tax[i]=0;
for(int i=1;i<=n;i++) ++tax[Rank[i]];
for(int i=1;i<=m;i++) tax[i]+=tax[i-1];
for(int i=n;i;i--) sa[tax[Rank[sec[i]]]--]=sec[i];
}
bool cmp(int x,int y,int l){return sec[x]==sec[y]&&sec[x+l]==sec[y+l];}
void SuffixSort()
{
for(int i=1;i<=n;i++) Rank[i]=a[i],sec[i]=i;
Rsort();
for(int p=0,w=1;p<n;w<<=1,m=p)
{
p=0;for(int i=n-w+1;i<=n;i++) sec[++p]=i;
for(int i=1;i<=n;i++) if(sa[i]>w) sec[++p]=sa[i]-w;
Rsort(),std::swap(Rank,sec),Rank[sa[p=1]]=1;
for(int i=2;i<=n;i++) Rank[sa[i]]=cmp(sa[i],sa[i-1],w)?p:++p;
}
for(int k,i=1;i<=n;i++)
for(k=sa[Rank[i]-1],h[i]=h[i-1]?h[i-1]-1:0;a[i+h[i]]==a[k+h[i]];++h[i]);
Log[0]=-1;
for(int i=1;i<=n;i++)
{
Log[i]=Log[i>>1]+1;
st[0][i]=lcp[0][i]=i;
hei[Rank[i]]=h[i];
}
for(int j=1;j<=19;j++)
{
for(int i=1;i<=n-(1<<j)+1;i++)
{
int x=st[j-1][i],y=st[j-1][i+(1<<j-1)];
st[j][i]=sa[x]<sa[y]?x:y;
x=lcp[j-1][i],y=lcp[j-1][i+(1<<j-1)];
lcp[j][i]=hei[x]<hei[y]?x:y;
}
}
}
int qryLCP(int l,int r)
{
int d=Log[r+1-l],x=lcp[d][l],y=lcp[d][r-(1<<d)+1];
return hei[x]<hei[y]?hei[x]:hei[y];
}
int qrypos(int l,int r)
{
int d=Log[r+1-l],x=st[d][l],y=st[d][r-(1<<d)+1];
return sa[x]<sa[y]?sa[x]:sa[y];
}
int main()
{
scanf("%d%d",&typ,&n);
if(typ==26)
{
scanf("%s",s+1);
for(int i=1;i<=n;i++) a[i]=b[i]=s[i];
}
else
for(int i=1;i<=n;i++) scanf("%d",a+i),b[i]=a[i];
std::sort(b+1,b+1+n);
m=std::unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++) a[i]=std::lower_bound(b+1,b+1+m,a[i])-b;
SuffixSort();
int p=1;
for(int i=1;i<=n;i++)
{
while(sa[p]+i-1>n) ++p;
if(hei[p+1]<i)
{
printf("%d ",sa[p]);
continue;
}
int l=p+1,r=n;
while(l<r)
{
int mid=l+r+1>>1;
if(qryLCP(p+1,mid)>=i) l=mid;
else r=mid-1;
}
printf("%d ",qrypos(p,l));
}
return 0;
}
2019.1.1
洛谷 P5108 仰望半月的夜空 解题报告的更多相关文章
- 洛谷P5108 仰望半月的夜空(后缀数组)
题意 题目链接 Sol warning:下面这个做法只有95分,本地拍了1w+组都没找到错误我表示十分无能为力 我们考虑每个串的排名去更新答案,显然排名为\(1\)的后缀的前缀一定是当前长度的字典序最 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- 洛谷 [HNOI2014]道路堵塞 解题报告
[HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...
随机推荐
- 【LeetCode21】Merge Two Sorted Lists★
1.题目描述: 2.解题思路: 本题是要合并两个已经有序的单链表,思路很简单,有两种方法:非递归和递归. 3.Java代码: (1)非递归: 为方便操作,定义一个辅助的头节点,然后比较原来两个链表的头 ...
- OWASP移动安全漏洞Top 10
•脆弱的服务器端安全控制 在OWASP排第一的漏洞是“脆弱的服务器端安全控制”,顾名思义,就是没有以一个安全的方式从移动应用程序向服务器端发送数据,或在发送数据时暴露了一些敏感的API.例如,考虑对一 ...
- 2017-2018 Exp4 恶意代码分析 20155214曾士轩
目录 Exp4 恶意代码分析 实验内容 使用schtasks指令监控系统运行 主要思路 知识点 启发 Exp4 恶意代码分析 本次实验操使用Windows下的schtasks,sysmon,Proce ...
- 2017-2018-2 20155224『网络对抗技术』Exp4:恶意代码分析
原理与实践说明 实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systr ...
- 20155338《网络对抗》Exp3 免杀原理与实践
20155338<网络对抗>Exp3 免杀原理与实践 实验过程 一.免杀效果参考基准 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.v ...
- 20155339 Exp5 MSF基础应用
20155339 Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. 答: exploit是通过自己选择的漏洞和载荷进行攻击的一个过程. pay ...
- What's new in XAML of .NET 4.0( .NET 4.0中XAML的新功能 )
原文 What's new in XAML of .NET 4.0 What's new in XAML of .NET 4.0 Easy Object References with {x:Refe ...
- REST-framework快速构建API--频率
前面已经了解了API的认证和授权.认证,是对资源访问者的第一道门,必须有钥匙,你才能进来拿我的资源:授权,是对资源访问者的第二道门,虽然你进来了,但是你可以拿走什么资源,还是我说了算,就是授权. 当然 ...
- 《Effective Java》学习笔记 ——异常
充分发挥异常的优点,可以提高程序的可读性.可靠性和可维护性. 第57条 只针对异常的情况才使用异常 第58条 对可恢复的情况使用受检异常,对编程错误使用运行时异常 * 如果期望调用者能够适当的恢复,使 ...
- vuex实践之路——笔记本应用(三)
Actions Action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态. Action 可以包含任意异步操作. 让我们来注册一个简单的 act ...