题目

我还会写\(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;
}

【LGP5108】仰望半月的夜空的更多相关文章

  1. 【Luogu5108】仰望半月的夜空(后缀数组)

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

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

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

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

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

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

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

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

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

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

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

  7. P5108 仰望半月的夜空

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

  8. 伙伴们休息啦canvas绘图夜空小屋

    HTML5 canvas绘图夜空小屋 伙伴们园友们,夜深了,休息啦,好人好梦... 查看效果:http://hovertree.com/texiao/html5/28/ 效果图如下: 代码如下: &l ...

  9. HTML5夜空烟花绽放动画效果

    模板描述:HTML5夜空烟花绽放动画效果基于HTML5 canvas制作,模拟夜空烟花绽放动画效果,烟花会在夜空打出贺词,有新年快乐.合家幸福.万事如意.心想事成.财源广进等,文字可以自定义,做成各种 ...

随机推荐

  1. java使用lock实现一个简单的死锁程序

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public ...

  2. java调用 C# webservice接口

    java调用webservice接口方式有多种,本人很懒,测试一种满足我的需求,故为试验其他方法,仅供参考 一:工具 MyEclipse,C#编码发布的webservice接口 二:步骤 1.打开my ...

  3. spring 与 springmvc 的区别和定义

    前言:(内附 spring 下载地址,可以选择需要的版本,给有需要的朋友)补充一下基础知识,spring 的定义和 springmvc 的定义,来源于百度百科. spring 源码下载地址 https ...

  4. python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装

    一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...

  5. CF17E Palisection

    题意 给定一个长度为n的小写字母串.问你有多少对相交的回文子串(包含也算相交) 相交的回文子串个数 \(mod\ 51123987\) Sol 求相交的回文子串不太好求 考虑用总数减去不相交的回文串个 ...

  6. WC前的颓废——带花树

    QAQ现在很不想写题解博客那就来写个算法吧QAQ... 带花树 题目 来看个题... UOJ79. 某机房里有\(n\)个OIer,其中有\(n\)个男生,\(0\)个女生.现在他们要两两配对. 有\ ...

  7. NOI 2016 区间 解题报告

    题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...

  8. 精选10款HTML5手机模板

    1.Stroller | Mobile & Tablet Responsive Template 演示地址   购买地址 2.Ocean Mobile Template 演示地址   购买地址 ...

  9. javascript实现数据结构: 树和森林

    树的3种常用链表结构 1 双亲表示法(顺序存储结构) 优点:parent(tree, x)操作可以在常量时间内实现 缺点:求结点的孩子时需要遍历整个结构 用一组连续的存储空间来存储树的结点,同时在每个 ...

  10. 如何正确地在SOE中输出日志信息

    ArcGIS for Server提供完善的日志管理机制,用于日志的记录.查询和自动清除.开发人员在开发编写SOE代码时,应该采用该机制进行日志记录的输出.如果不采用该机制,输出的日志消息会写到Arc ...