题目链接

codeforces.

洛谷.

Solution

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void read(int &x) {
  4. x=0;int f=1;char ch=getchar();
  5. for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
  6. for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
  7. }
  8. void print(int x) {
  9. if(x<0) putchar('-'),x=-x;
  10. if(!x) return ;print(x/10),putchar(x%10+48);
  11. }
  12. void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
  13. #define lf double
  14. #define ll long long
  15. #define mid ((l+r)>>1)
  16. const int maxn = 4e5+10;
  17. const int inf = 1e9;
  18. const lf eps = 1e-8;
  19. int rt[maxn];
  20. namespace sgt { //segment tree
  21. int tot,ls[maxn*20],rs[maxn*20];
  22. void insert(int &p,int l,int r,int x) {
  23. if(!p) p=++tot;
  24. if(l==r) return ;
  25. if(x<=mid) insert(ls[p],l,mid,x);
  26. else insert(rs[p],mid+1,r,x);
  27. }
  28. int query(int p,int l,int r,int x,int y) {
  29. if((!p)||x>y) return 0;
  30. if(x<=l&&r<=y) return 1;
  31. int res=0;
  32. if(x<=mid) res|=query(ls[p],l,mid,x,y);
  33. if(y>mid) res|=query(rs[p],mid+1,r,x,y);
  34. return res;
  35. }
  36. int merge(int x,int y) {
  37. if(!x||!y) return x^y;
  38. int now=++tot;
  39. ls[now]=merge(ls[x],ls[y]);
  40. rs[now]=merge(rs[x],rs[y]);
  41. return now;
  42. }
  43. }
  44. int n,q;
  45. char s[maxn];
  46. namespace sam { //suffix automaton
  47. int tr[maxn][26],par[maxn],ml[maxn],cnt=1,lstp=1,pos[maxn];
  48. void append(int x) {
  49. int p=lstp,np=++cnt;ml[np]=ml[p]+1;lstp=np;
  50. sgt::insert(rt[np],1,n,ml[np]);
  51. for(;p&&tr[p][x]==0;p=par[p]) tr[p][x]=np;
  52. if(!p) return par[np]=1,void();
  53. int q=tr[p][x];
  54. if(ml[p]+1<ml[q]) {
  55. int nq=++cnt;ml[nq]=ml[p]+1;
  56. memcpy(tr[nq],tr[q],sizeof tr[nq]);
  57. par[nq]=par[q],par[q]=par[np]=nq;
  58. for(;p&&tr[p][x]==q;p=par[p]) tr[p][x]=nq;
  59. } else par[np]=q;
  60. }
  61. struct Tree {
  62. int head[maxn],tot;
  63. struct edge{int to,nxt;}e[maxn<<1];
  64. void ins(int u,int v) {e[++tot]=(edge){v,head[u]},head[u]=tot;}
  65. void dfs(int x) {
  66. for(int i=head[x];i;i=e[i].nxt)
  67. dfs(e[i].to),rt[x]=sgt::merge(rt[x],rt[e[i].to]);
  68. }
  69. }T;
  70. void prepare() {for(int i=2;i<=cnt;i++) T.ins(par[i],i);T.dfs(1);}
  71. void solve() {
  72. int l,r;read(l),read(r);scanf("%s",s+1);
  73. int len=strlen(s+1),now=1,lim=len;pos[0]=1;
  74. for(int i=1,v;i<=len;i++)
  75. if(tr[now][v=s[i]-'a']) now=tr[now][v],pos[i]=now;
  76. else {lim=i-1;break;}
  77. int bo=0;
  78. for(int i=lim;~i;i--) {
  79. for(int j=(i==len?0:s[i+1]-'a'+1);j<26;j++)
  80. if(sgt::query(rt[tr[pos[i]][j]],1,n,l+i,r)) {
  81. for(int k=1;k<=i;k++) putchar(s[k]);
  82. putchar(j+'a'),puts(""),bo=1;goto end;
  83. }
  84. }end:;
  85. if(!bo) puts("-1");
  86. }
  87. }
  88. int main() {
  89. scanf("%s",s+1);n=strlen(s+1);
  90. for(int i=1;i<=n;i++) sam:: append(s[i]-'a');
  91. sam:: prepare();read(q);while(q--) sam::solve();
  92. return 0;
  93. }

[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面试中问及HIBERNATE与 MYBATIS的对比

    第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好H ...

  2. MySQL高级-查询截取分析

    一.如何分析 1.观察.至少跑1天,看看生产的慢SQL情况. 2.开启慢查询日志,设置阙值比如超过5秒钟的就是慢SQL,并将它抓取出来. 3.explain + 慢SQL分析 4.show profi ...

  3. jQuery wordexport导出 word

    同事给我说了简单的导出word的插件,亲测了下,做个随笔. 这个导出插件是jQuery自带的的插件,通过调用wordexport.js来实现导出功能. 1.引入的js <script type= ...

  4. pg 与 oracle 比较

    所谓动态引擎,就是说比如有很多张表的Join,原始的做法是一开始就生成好这个执行计划,随后执行,但实际上很多表Join的时候,你一开始生成的那个执行计划很有可能是不对的. 那么动态执行计划就是指它可以 ...

  5. git的一些操作指令

    1. mkdir learn 创建learn文件夹(也可不用命令创建,直接右击新建即可)   cd learn进入learn文件夹   git init  把learn文件夹 变成 可以用git管理的 ...

  6. selenium,unittest——两个class连续运行

    将多个class放在一个文件内一起运行,这是一个多用例不同网站进行测试的方法 #encoding=utf-8from selenium import webdriverimport time,unit ...

  7. TPO-11 C1 Use the gym pass

    TPO-11 C1 Use the gym pass 第 1 段 1.Listen to a conversation between a student and a university emplo ...

  8. python中出现ascii编码问题的解决办法

    一劳永逸,一次性全盘解决的办法 环境变量中去设置 以centos 7为例: vim /etc/profile export PYTHONIOENCODING=utf-8 source /etc/pro ...

  9. 【text】 文本组件说明

    text文本组件:在小程序里除了文本节点以外的其他节点都无法长按选中. 原型: <text selectable="[Boolean]" space="[ensp ...

  10. 【Python 开发】第三篇:python 实用小工具

    一.快速启动一个web下载服务器 官方文档:https://docs.python.org/2/library/simplehttpserver.html 1)web服务器:使用SimpleHTTPS ...