题目

我还会写\(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】仰望半月的夜空相关推荐

  1. 洛谷 P5108 仰望半月的夜空 解题报告

    P5108 仰望半月的夜空 题目描述 半月的夜空中,寄托了多少人与人之间的思念啊 曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\) 由于思念汇集的过于复杂,因此曦月希望提炼出所有的思念 ...

  2. bzoj5108 数据_【Luogu5108】仰望半月的夜空(后缀数组)

    [Luogu5108]仰望半月的夜空(后缀数组) 题面 题解 实名举报这题在比赛之前还不是这个样子的,还被我用SAM给水过去了 很明显求出$SA$之后就是按照$SA$的顺序从前往后考虑每一个长度,这样 ...

  3. luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...

    仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...

  4. 洛谷P5108 仰望半月的夜空(后缀数组)

    题意 题目链接 Sol warning:下面这个做法只有95分,本地拍了1w+组都没找到错误我表示十分无能为力 我们考虑每个串的排名去更新答案,显然排名为\(1\)的后缀的前缀一定是当前长度的字典序最 ...

  5. P5108 仰望半月的夜空

    题目链接 题意分析 给你一个字符串 让你求\(1-n\)长度下的字符串的中字典序最小并且最靠左的字符串的开头位置 我们考虑先建出\(SA\) 然后考虑对于一个字符串后缀排序之后 baba后缀排序之后 ...

  6. Luogu 5108 仰望半月的夜空(后缀数组)

    如果是要求左端点最大,直接求出SA,找前缀名次最小值就可以了.虽然现在要左端点最小,但我们已经知道了这个字典序最小的串是什么,找到名次数组上的合法区间求最小值即可.我也不知道为什么我会弃掉这个题,可能 ...

  7. P5108 仰望半月的夜空 SAM+线段树覆盖

    $ \color{#0066ff}{ 题目描述 }$ 半月的夜空中,寄托了多少人与人之间的思念啊 曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\) 由于思念汇集的过于复杂,因此曦月希望 ...

  8. 【背板子-后缀数组】BZOJ4199 BZOJ4650 LGP5108 CF504E

    [前言] 后缀数组一直是我没有背的板子来着. 强行背了下来. adjust这个函数丢不掉了. [题目] BZOJ4199 [NOI2015] 品酒大会 BZOJ 按heightheightheight ...

  9. oracle两表联查分组,oracle解决多表关联分组查询问题

    做了一个功能需要分组查询,同时查询A表分组查询的ID需要关联B表的数据,本来想两个表关联查询,但是报group by 语法不正确.所以做了以下修改. select count(*), cindexid ...

  10. 2018十二月刷题列表

    Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...

最新文章

  1. 基于mybatis声明SQL Session对象
  2. 小程序创业:新金矿、野望与焦虑
  3. Python练习1-文档格式化成html
  4. Linux——POSIX有名信号量
  5. 怎么实现hover_写CSS动效的常用套路(附demo的效果实现与源码)
  6. ObjectOutputStream 和 ObjectInputStream类的简单介绍,及运用。
  7. __builtin_expect提高运行效率
  8. ios开发之--UITextField光标右移
  9. 为什么很多人愿意去下载社交APP?
  10. 什么是测地线(geodesic)?【讲解清晰生动,深入浅出,通俗易懂】
  11. 使电动机反转的matlab仿真图,基于MATLAB的电机仿真研究
  12. python 分析单细胞数据教程 scanpy---初探
  13. 打游戏经常有人喷,刷个B站还是有?Python实现在网站上自动评论!键盘侠都喷不赢你!
  14. 生成自定义文字的二维码
  15. 群晖docker搭建halo个人博客
  16. 嵌入式系统C语言编程基础
  17. 从零开始学习SEO的基础概念
  18. office2007在ppt中插入文件对象(可以单击打开)
  19. 移动端 外部浏览器点击按钮跳转微信界面(唤醒微信)
  20. 微信公众号配置token

热门文章

  1. 查看往年CET46级成绩考试记录
  2. 数据库系统--期末复习
  3. 网站关键词密度多少会比较合适?
  4. linux微内核,开源微内核seL4microkernel
  5. 拖拉机大战贺岁版发布
  6. 智能车基于RT1064+无线串口透传模块利用MATLAB辅助调节PID参数
  7. 有关计算机语言的英语对话,2021有关计算机语言英语口语表达
  8. ksearch系统开发过程中遇到的KFC性能问题
  9. grub4dos linux live,grub4dos安装
  10. 实验1前篇——BIOS编程空间