【LGP5108】仰望半月的夜空
题目
我还会写\(SA\)和 \(ST\)表真是令人感动
发现这是一个思博题
我们开一个指针,标记一下当前合法的字典序最小的后缀排名在哪里,刚开始自然是\(1\)
我们发现这个后缀不能为我们提供\(i\)的长度我们就右移这个指针
之后我们二分+\(St\)表找到从这个后缀往右扩展的最大距离,查一下这里面最小的\(sa\)就好了
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=300005;
inline int read() {char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
char S[maxn];
int sa[maxn],het[maxn],rk[maxn],tp[maxn],tax[maxn];
int c[maxn],a[maxn];
int n,opt,m,sz;
int log_2[maxn],St[maxn][20],v[maxn][20];
inline int find(int x) {int l=1,r=sz;while(l<=r) {int mid=l+r>>1;if(c[mid]==x) return mid;if(c[mid]<x) l=mid+1;else r=mid-1;}return 0;
}
inline void qsort() {for(re int i=0;i<=m;i++) tax[i]=0;for(re int i=1;i<=n;i++) tax[rk[i]]++;for(re int i=1;i<=m;i++) tax[i]+=tax[i-1];for(re int i=n;i;i--) sa[tax[rk[tp[i]]]--]=tp[i];
}
inline int query(int l,int r) {int k=log_2[r-l+1];return min(St[l][k],St[r-(1<<k)+1][k]);
}
inline int ask(int l,int r) {int k=log_2[r-l+1]; return min(v[l][k],v[r-(1<<k)+1][k]);
}
int main() {opt=read(),n=read();if(opt==26) {scanf("%s",S+1);for(re int i=1;i<=n;i++) a[i]=S[i]-'a';}else for(re int i=1;i<=n;i++) a[i]=read();for(re int i=1;i<=n;i++) c[i]=a[i];std::sort(c+1,c+n+1);sz=std::unique(c+1,c+n+1)-c-1;for(re int i=1;i<=n;i++) a[i]=find(a[i]);for(re int i=1;i<=n;i++) rk[i]=a[i],tp[i]=i;m=sz;qsort();for(re int w=1,p=0;p<n;m=p,w<<=1) {p=0;for(re int i=1;i<=w;i++) tp[++p]=n-w+i;for(re int i=1;i<=n;i++) if(sa[i]>w) tp[++p]=sa[i]-w;qsort();for(re int i=1;i<=n;i++) std::swap(rk[i],tp[i]);rk[sa[1]]=p=1;for(re int i=2;i<=n;i++)rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w])?p:++p;}int k=0;for(re int i=1;i<=n;i++) {if(k) --k;int j=sa[rk[i]-1];while(a[i+k]==a[j+k]) ++k;het[rk[i]]=k;}for(re int i=1;i<=n;i++) St[i][0]=het[i];for(re int i=2;i<=n;i++) log_2[i]=log_2[i>>1]+1;for(re int j=1;j<=log_2[n];j++) for(re int i=1;i+(1<<j)-1<=n;i++)St[i][j]=min(St[i][j-1],St[i+(1<<(j-1))][j-1]);for(re int i=1;i<=n;i++) v[i][0]=sa[i];for(re int j=1;j<=log_2[n];j++)for(re int i=1;i+(1<<j)-1<=n;i++)v[i][j]=min(v[i][j-1],v[i+(1<<(j-1))][j-1]);int now=1;for(re int i=1;i<=n;i++) {while(sa[now]+i-1>n) now++;int l=2,r=n-now+1;int ans=1;while(l<=r) {int mid=l+r>>1;if(query(now+1,now+mid-1)>=i) ans=mid,l=mid+1;else r=mid-1;}printf("%d ",ask(now,now+ans-1));}return 0;
}
转载于:https://www.cnblogs.com/asuldb/p/10562757.html
【LGP5108】仰望半月的夜空相关推荐
- 洛谷 P5108 仰望半月的夜空 解题报告
P5108 仰望半月的夜空 题目描述 半月的夜空中,寄托了多少人与人之间的思念啊 曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\) 由于思念汇集的过于复杂,因此曦月希望提炼出所有的思念 ...
- bzoj5108 数据_【Luogu5108】仰望半月的夜空(后缀数组)
[Luogu5108]仰望半月的夜空(后缀数组) 题面 题解 实名举报这题在比赛之前还不是这个样子的,还被我用SAM给水过去了 很明显求出$SA$之后就是按照$SA$的顺序从前往后考虑每一个长度,这样 ...
- luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...
仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...
- 洛谷P5108 仰望半月的夜空(后缀数组)
题意 题目链接 Sol warning:下面这个做法只有95分,本地拍了1w+组都没找到错误我表示十分无能为力 我们考虑每个串的排名去更新答案,显然排名为\(1\)的后缀的前缀一定是当前长度的字典序最 ...
- P5108 仰望半月的夜空
题目链接 题意分析 给你一个字符串 让你求\(1-n\)长度下的字符串的中字典序最小并且最靠左的字符串的开头位置 我们考虑先建出\(SA\) 然后考虑对于一个字符串后缀排序之后 baba后缀排序之后 ...
- Luogu 5108 仰望半月的夜空(后缀数组)
如果是要求左端点最大,直接求出SA,找前缀名次最小值就可以了.虽然现在要左端点最小,但我们已经知道了这个字典序最小的串是什么,找到名次数组上的合法区间求最小值即可.我也不知道为什么我会弃掉这个题,可能 ...
- P5108 仰望半月的夜空 SAM+线段树覆盖
$ \color{#0066ff}{ 题目描述 }$ 半月的夜空中,寄托了多少人与人之间的思念啊 曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\) 由于思念汇集的过于复杂,因此曦月希望 ...
- 【背板子-后缀数组】BZOJ4199 BZOJ4650 LGP5108 CF504E
[前言] 后缀数组一直是我没有背的板子来着. 强行背了下来. adjust这个函数丢不掉了. [题目] BZOJ4199 [NOI2015] 品酒大会 BZOJ 按heightheightheight ...
- oracle两表联查分组,oracle解决多表关联分组查询问题
做了一个功能需要分组查询,同时查询A表分组查询的ID需要关联B表的数据,本来想两个表关联查询,但是报group by 语法不正确.所以做了以下修改. select count(*), cindexid ...
- 2018十二月刷题列表
Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...
最新文章
- 基于mybatis声明SQL Session对象
- 小程序创业:新金矿、野望与焦虑
- Python练习1-文档格式化成html
- Linux——POSIX有名信号量
- 怎么实现hover_写CSS动效的常用套路(附demo的效果实现与源码)
- ObjectOutputStream 和 ObjectInputStream类的简单介绍,及运用。
- __builtin_expect提高运行效率
- ios开发之--UITextField光标右移
- 为什么很多人愿意去下载社交APP?
- 什么是测地线(geodesic)?【讲解清晰生动,深入浅出,通俗易懂】
- 使电动机反转的matlab仿真图,基于MATLAB的电机仿真研究
- python 分析单细胞数据教程 scanpy---初探
- 打游戏经常有人喷,刷个B站还是有?Python实现在网站上自动评论!键盘侠都喷不赢你!
- 生成自定义文字的二维码
- 群晖docker搭建halo个人博客
- 嵌入式系统C语言编程基础
- 从零开始学习SEO的基础概念
- office2007在ppt中插入文件对象(可以单击打开)
- 移动端 外部浏览器点击按钮跳转微信界面(唤醒微信)
- 微信公众号配置token