LINK:Security

求一个严格大于T的字符串 是原字符串S[L,R]的子串。

容易想到尽可能和T相同 然后再补一个尽可能小的字符即可。

出于这种思想 可以在SAM上先跑匹配 然后枚举加哪个字符 判定即可。

判定s是否在[L,R]中出现过 最快的方法 就是right集了。

这个可以线段树合并完成 注意 合并的时候 需要新建节点 防止把儿子的信息给改了。

倒着贪心即可。空间复杂度大概是nlog^2左右的注意开够。(我也不太会计算空间

const int MAXN=100010;
int n,m,id,len;
int last=1,cnt=1,top;
char a[MAXN<<1],b[MAXN<<1];
struct wy
{
int fa,len;
int ch[26];
}t[MAXN<<1];
int root[MAXN<<1],q[MAXN<<1],c[MAXN<<1],pre[MAXN<<1];
struct jl{int l,r,sum;}s[MAXN*200];
inline void insert(int x)
{
int p=last;
int np=last=++cnt;
len(np)=len(p)+1;
while(p&&!t[p].ch[x])
{
t[p].ch[x]=np;
p=f(p);
}
if(!p)f(np)=1;
else
{
int q=t[p].ch[x];
if(len(p)+1==len(q))f(np)=q;
else
{
int nq=++cnt;
t[nq]=t[q];
len(nq)=len(p)+1;
f(np)=f(q)=nq;
while(p&&t[p].ch[x]==q)
{
t[p].ch[x]=nq;
p=f(p);
}
}
}
}
inline void change(int &p,int l,int r,int x)
{
if(!p)p=++id;
if(l==r){++sum(p);return;}
int mid=(l+r)>>1;
if(x<=mid)change(l(p),l,mid,x);
else change(r(p),mid+1,r,x);
sum(p)=sum(l(p))+sum(r(p));
}
inline void topsort()
{
rep(1,cnt,i)++c[len(i)];
rep(1,cnt,i)c[i]+=c[i-1];
rep(1,cnt,i)q[c[len(i)]--]=i;
}
inline int merge(int x,int y,int l,int r)
{
if(!x||!y)return x|y;
int w=++id;
if(l==r){sum(w)=sum(x)+sum(y);return w;}
int mid=(l+r)>>1;
l(w)=merge(l(x),l(y),l,mid);
r(w)=merge(r(x),r(y),mid+1,r);
sum(w)=sum(l(w))+sum(r(w));
return w;
}
inline int ask(int p,int l,int r,int L,int R)
{
if(!p||L>R)return 0;
if(L<=l&&R>=r)return sum(p);
int mid=(l+r)>>1,ww=0;
if(L<=mid)ww+=ask(l(p),l,mid,L,R);
if(R>mid)ww+=ask(r(p),mid+1,r,L,R);
return ww;
}
int main()
{
freopen("1.in","r",stdin);
gc(a);len=strlen(a+1);
rep(1,len,i)insert(a[i]-'a'),change(root[last],1,len,i);
topsort();gt(n);
fep(cnt,2,i)root[f(q[i])]=merge(root[f(q[i])],root[q[i]],1,len);
rep(1,n,i)
{
int x,y;
gt(x);gt(y);gc(b);
int now=1,last=-1,flag=0;top=0;
int len1=strlen(b+1);
rep(1,len1,j)
{
int cc=b[j]-'a';
if(t[now].ch[cc])pre[t[now].ch[cc]]=now,now=t[now].ch[cc],a[++top]=b[j];
else {last=b[j]-'a';break;}
}
while(now)
{
rep(last+1,25,j)
{
if(flag)break;
int ww=t[now].ch[j];
if(ww)
{
if(ask(root[ww],1,len,x+top,y))
{
a[++top]=j+'a';
flag=1;
}
}
}
if(flag)break;
now=pre[now];last=b[top]-'a';
--top;
}
if(!flag){puts("-1");}
else {rep(1,top,i)printf("%c",a[i]);puts("");}
}
return 0;
}

CF1037H Security 线段树合并 SAM的更多相关文章

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

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

  2. 【Codeforces 1037H】Security(SAM & 线段树合并)

    Description 给出一个字符串 \(S\). 给出 \(Q\) 个操作,给出 \(L, R, T\),求字典序最小的 \(S_1\),使得 \(S^\prime\) 为\(S[L..R]\) ...

  3. CodeForces - 1037H: Security(SAM+线段树合并)

    题意:给定字符串S:  Q次询问,每次询问给出(L,R,T),让你在S[L,R]里面找一个字典序最小的子串,其字典序比T大. 没有则输出-1: 思路:比T字典序大,而且要求字典最小,显然就是在T的尾巴 ...

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

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

  5. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree

    原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...

  6. UOJ#395. 【NOI2018】你的名字 字符串,SAM,线段树合并

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ395.html 题解 记得同步赛的时候这题我爆0了,最暴力的暴力都没调出来. 首先我们看看 68 分怎么做 ...

  7. Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...

  8. loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增

    题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在paren ...

  9. 2019.02.27 bzoj4556: [Tjoi2016&Heoi2016]字符串(二分答案+sam+线段树合并)

    传送门 题意:给一个字符串SSS. 有mmm次询问,每次给四个参数a,b,c,da,b,c,da,b,c,d,问s[a...b]s[a...b]s[a...b]的所有子串和s[x...y]s[x... ...

随机推荐

  1. µDoo持有者将分享我们广告总收入的10%,并以BTC支付!

    Jason8th October 2019 在数字化世界中,去中心化将是未来,Howdoo的社交媒体和内容交付理念为在新经济中使用的核心用户提供了公平.透明的奖励回报.随着Howdoo上的内容创作者有 ...

  2. 不用破解版的 Navicat 了,几款免费且好用的 SQL 客户端送给你

    我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 没别的意思,今天就是为了给你推荐几款 MySQL 客户端,这几款 ...

  3. C#远程连接代码

    /// <summary> /// 服务连接配置类(验证服务账号是否正确) /// </summary> /// <param name="remoteHost ...

  4. day39 进程

    目录 一.进程对象的其他方法 二.僵尸进程与孤儿进程(了解) 1 僵尸进程 2 孤儿进程 三.守护进程 四.互斥锁 五.进程间通信 六.IPC机制 七.生产者消费者模型 八.线程理论 一.进程对象的其 ...

  5. 数据可视化基础专题(九):Matplotlib 基础(一)坐标相关

    1.前言 图表要素如下图所示 # sphinx_gallery_thumbnail_number = 3 import matplotlib.pyplot as plt import numpy as ...

  6. A Mountaineer 最详细的解题报告

    题目来源:A Mountaineer (不知道该链接是否可以直接访问,所以将题目复制下来了) 题目如下: D - A Mountaineer Time limit : 2sec / Stack lim ...

  7. bzoj2697特技飞行*

    bzoj2697特技飞行 题意: N个单位时间,每个单位时间可以进行一项特技动作,可选的动作有K种,每种动作有一个刺激程度Ci.每次动作的价值为(距上次该动作的时间)*Ci,若为第一次进行该动作,价值 ...

  8. java中AQS源码分析

    AQS内部采用CLH队列.CLH队列是由节点组成.内部的Node节点包含的状态有 static final int CANCELLED =  1; static final int SIGNAL    ...

  9. Ethical Hacking - POST EXPLOITATION(3)

    Spying - Capturing Key Strikes & Taking Screen Shots Log all mouse/keyboard events > keyscan- ...

  10. TestNg失败重跑—解决使用 dataProvider 参数化用例次数冲突问题

    问题背景 在使用 testng 执行 UI 自动化用例时,由于 UI自动化的不稳定性,我们在测试的时候,往往会加上失败重跑机制.在不使用 @DataProvider 提供用例参数化时,是不会有什么问题 ...