题目链接

codeforces.

洛谷.

Solution

按照套路,可以\(SAM\)上线段树合并求出\(endpos\)集合,然后随便贪心一下就好了。

#include<bits/stdc++.h>
using namespace std; void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long
#define mid ((l+r)>>1) const int maxn = 4e5+10;
const int inf = 1e9;
const lf eps = 1e-8; int rt[maxn]; namespace sgt { //segment tree
int tot,ls[maxn*20],rs[maxn*20]; void insert(int &p,int l,int r,int x) {
if(!p) p=++tot;
if(l==r) return ;
if(x<=mid) insert(ls[p],l,mid,x);
else insert(rs[p],mid+1,r,x);
} int query(int p,int l,int r,int x,int y) {
if((!p)||x>y) return 0;
if(x<=l&&r<=y) return 1;
int res=0;
if(x<=mid) res|=query(ls[p],l,mid,x,y);
if(y>mid) res|=query(rs[p],mid+1,r,x,y);
return res;
} int merge(int x,int y) {
if(!x||!y) return x^y;
int now=++tot;
ls[now]=merge(ls[x],ls[y]);
rs[now]=merge(rs[x],rs[y]);
return now;
}
} int n,q;
char s[maxn]; namespace sam { //suffix automaton
int tr[maxn][26],par[maxn],ml[maxn],cnt=1,lstp=1,pos[maxn];
void append(int x) {
int p=lstp,np=++cnt;ml[np]=ml[p]+1;lstp=np;
sgt::insert(rt[np],1,n,ml[np]);
for(;p&&tr[p][x]==0;p=par[p]) tr[p][x]=np;
if(!p) return par[np]=1,void();
int q=tr[p][x];
if(ml[p]+1<ml[q]) {
int nq=++cnt;ml[nq]=ml[p]+1;
memcpy(tr[nq],tr[q],sizeof tr[nq]);
par[nq]=par[q],par[q]=par[np]=nq;
for(;p&&tr[p][x]==q;p=par[p]) tr[p][x]=nq;
} else par[np]=q;
} struct Tree {
int head[maxn],tot;
struct edge{int to,nxt;}e[maxn<<1];
void ins(int u,int v) {e[++tot]=(edge){v,head[u]},head[u]=tot;}
void dfs(int x) {
for(int i=head[x];i;i=e[i].nxt)
dfs(e[i].to),rt[x]=sgt::merge(rt[x],rt[e[i].to]);
}
}T; void prepare() {for(int i=2;i<=cnt;i++) T.ins(par[i],i);T.dfs(1);} void solve() {
int l,r;read(l),read(r);scanf("%s",s+1);
int len=strlen(s+1),now=1,lim=len;pos[0]=1;
for(int i=1,v;i<=len;i++)
if(tr[now][v=s[i]-'a']) now=tr[now][v],pos[i]=now;
else {lim=i-1;break;}
int bo=0;
for(int i=lim;~i;i--) {
for(int j=(i==len?0:s[i+1]-'a'+1);j<26;j++)
if(sgt::query(rt[tr[pos[i]][j]],1,n,l+i,r)) {
for(int k=1;k<=i;k++) putchar(s[k]);
putchar(j+'a'),puts(""),bo=1;goto end;
}
}end:;
if(!bo) puts("-1");
}
} int main() {
scanf("%s",s+1);n=strlen(s+1);
for(int i=1;i<=n;i++) sam:: append(s[i]-'a');
sam:: prepare();read(q);while(q--) sam::solve();
return 0;
}

[CF1037H] Security的更多相关文章

  1. CF1037H Security 线段树合并 SAM

    LINK:Security 求一个严格大于T的字符串 是原字符串S[L,R]的子串. 容易想到尽可能和T相同 然后再补一个尽可能小的字符即可. 出于这种思想 可以在SAM上先跑匹配 然后枚举加哪个字符 ...

  2. CF1037H Security——SAM+线段树合并

    又是一道\(SAM\)维护\(endpos\)集合的题,我直接把CF700E的板子粘过来了QwQ 思路 如果我们有\([l,r]\)对应的\(SAM\),只需要在上面贪心就可以了.因为要求的是字典序比 ...

  3. CF1037H Security 后缀自动机 + right集合线段树合并 + 贪心

    题目描述: 给定一个字符串 $S$ 给出 $Q$ 个操作,给出 $L,R,T$,求出字典序最小的 $S_{1}$ 为 $S[L...R]$的子串,且 $S_{1}$ 的字典序严格大于 $T$. 输出这 ...

  4. SAM 做题笔记(各种技巧,持续更新,SA)

    SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...

  5. [笔记] 后缀自动机 (SAM)

    实现 void ins(int c){ int np = ++dcnt, p = lst; lst = np; t[np].len = t[p].len + 1, t[np].eps = 1; whi ...

  6. Security Policy:行级安全(Row-Level Security)

    行级安全RLS(Row-Level Security)是在数据行级别上控制用户的访问,控制用户只能访问数据库表的特定数据行.断言是逻辑表达式,在SQL Server 2016中,RLS是基于安全断言( ...

  7. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  8. Spring Security OAuth2 开发指南

    官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. 转载请注明来源:htt ...

  9. WCF : 修复 Security settings for this service require Windows Authentication but it is not enabled for the IIS application that hosts this service 问题

    摘要 : 最近遇到了一个奇怪的 WCF 安全配置问题, WCF Service 上面配置了Windows Authentication. IIS上也启用了 Windows Authentication ...

随机推荐

  1. Java:break和continue关键字的作用

    二者的作用和区别 1. break:直接跳出当前循环体(while.for.do while)或程序块(switch).其中switch case执行时,一定会先进行匹配,匹配成功返回当前case的值 ...

  2. 卸载Oracle 11g

    卸载oracle只需要执行deinstall.ba即可 运行.bat文件 按照提示步骤进行卸载 .bat文件所在目录需要手动删除,需要在程序管理器里面关掉Oracle的进程,在删除当前文件夹

  3. hdu1848Fibonacci again and again(sg函数)

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  4. 第三篇 JavaScript基础

    知识预览 BOM对象 DOM对象(DHTML) 实例练习 转:https://www.cnblogs.com/yuanchenqi/articles/5980312.html#_label2 一.Ja ...

  5. Java 语法基础

    一 关键字 关键字: 其实就是某种语言赋予了特殊含义的单词 保留字: 其实就是还没有赋予特殊含义 但是准备日后要使用过的单词 二 标示符 标示符: 其实就是在程序中自定义的名词 比如类名, 变量名, ...

  6. Python列表操作大全(非常全)

    Python列表操作大全(非常全!!!) 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且 ...

  7. 【setUp-tearDown】线程组开始,结束各执行一次

    使用setUp线程组的方式  ——> 开始 使用tearDown线程组 的方式 ——>结束

  8. AVL树和伸展树 -数据结构(C语言实现)

    读数据结构与算法分析 AVL树 带有平衡条件的二叉树,通常要求每颗树的左右子树深度差<=1 可以将破坏平衡的插入操作分为四种,最后通过旋转恢复平衡 破坏平衡的插入方式 描述 恢复平衡旋转方式 L ...

  9. Java学习 · 初识 面向对象基础一

    面向对象基础 1.1面向过程与面向对象的区别 面向过程和面向对象二者都是思考问题的方式,再简单的事物时,可以线性思考时使用面向过程,但当事物较为复杂时,只能使用面向对象设计.但二者并不是对立的,在解决 ...

  10. ubuntu ssh配置

    Secure Shell (SSH) is a cryptographic network protocol for operating network services securely over ...