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. CSS Sprites精灵图(雪碧图)

    简介 CSS精灵图,是一种网页图片应用处理方式.允许将一个页面涉及到的所有零星图片都包含到一张大图中 利用CSS的"background-image","backgrou ...

  2. zabbix + grafana 展示

    环境CentOS 7.5 一,grafana 安装. 1,配置yum源 cat > /etc/yum.repos.d/grafana.repo <<EOF [grafana] nam ...

  3. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  4. Spring Boot 2 实战:常用读取配置的方式

    1. 前言 在Spring Boot项目中我们经常需要读取application.yml配置文件的自定义配置,今天就来罗列一下从yaml读取配置文件的一些常用手段和方法. 2. 使用@Value注解 ...

  5. Pop!_OS安装与配置(一):下载安装

    Pop!_OS安装过程 0x0 Pop!_OS简介 0x1 下载 0x2 启动盘制作 0x3 重启安装 如何分区 0x4 重启进入Pop!_OS 0x0 Pop!_OS简介 Linux发行版选哪个? ...

  6. js数组算法题01

    题目:随机生成一个长度为 10 的整数类型的数组,例如 [2, 10, 3, 4, 5, 11, 10, 11, 20],将其排列成一个新数组,要求新数组形式如下,例如 [[2, 3, 4, 5], ...

  7. web 部署专题(五):nginx 安装(一) 树莓派

    1.安装Nginx sudo apt-get install nginx 2.启动Nginx sudo /etc/init.d/nginx start 3.测试安装是否成功(nginx默认是80端口) ...

  8. 一文读懂Java中的动态代理

    从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂动态代理,应从代理模式说起.而实现代理模式,常见有下面两种实现: (1) 代理类关联目标对象,实现目标对象实现的 ...

  9. kafka零拷贝

    Kafka之所以那么快的另外一个原因就是零拷贝(zero-copy)技术.本文我们就来了解Kafka中使用的零拷贝技术为什么那么快. 传统的文件拷贝 传统的文件拷贝通常需要从用户态去转到核心态,经过r ...

  10. python实现图片文字提取,准确率高达99%,强无敌!!!

    上次我使用的百度AI开放平台的API接口实现图片的转化,后来有许多小伙伴都私信问我,怎么获取百度AI平台的AK和SK.为了统一回答大家的问题,今天我又使用百度API实现了一个从图片中提取文字和识别身份 ...