解析

算是一个比较高级的SAM的应用了
对fail树的dfs序建立维护右端点最大值的线段树
考虑把所有的询问离线,按照右端点排序
每次动态把当前询问右端点左侧的前缀插入线段树
处理询问时,先贪心的尝试和询问串填法一样,如果不行就往下一个字母填
判断合法的标志就是左端点的最大值是否不小于询问的左端点

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m;
struct node{int len,fa;int tr[26];
}st[N];
int tot(1),lst(1),id[N];
void ins(int c,int ide){c-='a';int cur=++tot,p=lst;lst=tot;st[cur].len=st[p].len+1;id[ide]=cur;for(;p&&!st[p].tr[c];p=st[p].fa) st[p].tr[c]=cur;if(!st[p].tr[c]) st[cur].fa=1;else{int q=st[p].tr[c];if(st[q].len==st[p].len+1) st[cur].fa=q;else{int pp=++tot;st[pp]=st[q];st[pp].len=st[p].len+1;st[q].fa=st[cur].fa=pp;for(;p&&st[p].tr[c]==q;p=st[p].fa) st[p].tr[c]=pp;return;}}
}struct
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
segment_tree{int mx[N<<2];int ask(int k,int l,int r,int x,int y){if(x<=l&&r<=y) return mx[k];int res=0;if(x<=mid) res=max(res,ask(ls,l,mid,x,y));if(y>mid) res=max(res,ask(rs,mid+1,r,x,y));    //if(k==1) printf("---ask: (%d %d) res=%d\n",x,y,res);return res;}void upd(int k,int l,int r,int p,int w){//if(k==1) printf("---upd: p=%d w=%d\n",p,w);if(l==r){mx[k]=max(mx[k],w);return;}if(p<=mid) upd(ls,l,mid,p,w);else upd(rs,mid+1,r,p,w);mx[k]=max(mx[ls],mx[rs]);return;}
}t;string s,ss,ask[N],ans[N];
struct query{int id,l,r,len;bool operator < (const query o)const{return r<o.r;}
}q[N];
int St[N],tim,Ed[N];
vector<int>v[N];
void dfs(int x){St[x]=++tim;for(const auto &to:v[x]) dfs(to);Ed[x]=tim;return;
}
bool jd[N];
inline bool check(int x,int l,int len){//printf("  check:x=%d l=%d len=%d ask=%d\n",x,l,len,t.ask(1,1,tim,St[x],Ed[x]));return t.ask(1,1,tim,St[x],Ed[x])-len+1>=l;
}
bool find(int x,int len,int o,int idx){if(len>q[idx].len){for(int i=0;i<=25;i++){if(st[x].tr[i]&&check(st[x].tr[i],q[idx].l,len)){jd[o]=1;ans[o]+='a'+i;//printf("ok x=%d to=%d\n",x,st[x].tr[i]);return true;}}return false;}  int c=ask[o][len]-'a';//printf("x=%d len=%d c=%d\n",x,len,c);if(st[x].tr[c]&&check(st[x].tr[c],q[idx].l,len)&&find(st[x].tr[c],len+1,o,idx)){ans[o]+='a'+c;return true;}else{for(int i=c+1;i<=25;i++){      if(st[x].tr[i]&&check(st[x].tr[i],q[idx].l,len)){//printf("?? o=%d ask=%d len=%d\n",o,t.ask(1,1,tim,St[st[x].tr[i]],Ed[st[x].tr[i]]),len);jd[o]=1;ans[o]+='a'+i;return true;}}return false;}
}
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifcin>>s;s.insert(s.begin(),' ');n=s.size()-1;for(int i=1;i<=n;i++) ins(s[i],i);for(int i=2;i<=tot;i++) v[st[i].fa].push_back(i);dfs(1);//for(int i=1;i<=tot;i++) printf("i=%d fa=%d (%d %d)\n",i,st[i].fa,St[i],Ed[i]);m=read();for(int i=1;i<=m;i++){q[i].l=read();q[i].r=read();q[i].id=i;cin>>ask[i];ask[i].insert(ask[i].begin(),' ');//if(i==75){//printf("(%d %d) ",q[i].l,q[i].r);cout<<ask[i]<<endl;//}q[i].len=ask[i].size()-1;}sort(q+1,q+1+m);int pl=0;for(int i=1;i<=m;i++){while(pl<q[i].r){++pl;t.upd(1,1,tim,St[id[pl]],pl);//printf("upd: node=%d pos=%d\n",id[pl],St[id[pl]]);}find(1,1,q[i].id,i);}for(int i=1;i<=m;i++){if(!jd[i]) printf("-1\n");else{for(int j=ans[i].size()-1;j>=0;j--) putchar(ans[i][j]);putchar('\n');}}return 0;
}
/*
*/

CF1037H Security(SAM)相关推荐

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

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

  2. CF1037H. Security

    CF1037H. Security Solution 1 设原串为ststst. 对于单个询问,答案必然是询问串sss的一个前缀s[1..i]s[1..i]s[1..i]加上一个大于s[i+1]s[i ...

  3. 关于windows安全权限

    随着网络的越来越普及,安全问题变的越来越重要.最近在项目中遇到关于NTFS下安全权限的设置问题,希望通过编程的方式来获取,编辑,设置Windows下文件夹或文件的安全权限.以前关于Windows安全性 ...

  4. 开机提示C0000218 unknown hard error的修复

    到宾馆后,将电脑连接网线,没有成功.宾馆的人调整后再连接网线,电脑重新启动后,无法正常进入win xp, 提示:C0000218, unknown hard error, 安全模式都进不了. < ...

  5. HackThisSite(Basic missions level1-11)攻略

    Level 1 第一关很简单 直接查看源代码 可以看到密码已经写在注释里了 复制粘贴 pass (复制的时候注意空格) Level 2 Network Security Sam set up a pa ...

  6. hackthissite(Basic missions level1-10)攻略

    突然想到之前有去过 http://www.hackthissite.org这个网站,玩了一两关,后来没好好玩下去,今天有点手痒,于是又去玩了一下,最后第11关没搞明白神马意思,前面10关总算是闯过去了 ...

  7. 计算机管理用户删除错误,删除隐藏用户时出错:注册表中的用户和组

    这篇文章主要是说明一下Windows系统下的用户和组在注册表中的存放位置与存放内容.实际的用处不是很多,主要是让我们大家可以更多的了解 Windows注册表. 好了,多于的话就说到这里,下面就让我带着 ...

  8. Windows Server入门系列29 Hash加密与SAM数据库

    在对用户账户管理的过程中,一个核心任务是如何管理好用户的密码.如果某个用户使用用户账户和密码成功通过了系统的登录认证,那么他之后执行的所有操作都自动具有该用户的权限,如果这个用户属于管理员组,那么他就 ...

  9. Spring Security 4 Method security using @PreAuthorize,@PostAuthorize, @Secured, EL--转

    原文地址:http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-pos ...

最新文章

  1. 014箱子开合并移动
  2. LAMP笔记之MySQL篇(2)
  3. Python Urllib库详解
  4. 浅谈.Net异步编程的前世今生----异步函数篇(完结)
  5. 10 文件无效_新手必看!10个CAD常见问题解决技巧
  6. vscode android入门,vscode Android调试
  7. 变量提升、作用域this实战(真题:看代码输出)
  8. linux 校园网 热点,Linux/Ubuntu 16.04 使用校园网客户端Dr.com DrClient 有线连网,同时开启WiFi热点...
  9. 串口和并口通信1-概念
  10. Win 10 + Ubuntu 18.04双系统 卸载Ubuntu
  11. 信息系统项目管理师考试难吗
  12. avr单片机流水灯程序c语言,AVR单片机综合流水灯C程序
  13. 如何上色?怎样才能配出好看的颜色?
  14. 云免流usb共享电脑_云免流usb共享电脑
  15. 我的微信公众号开通了
  16. Warshall算法(用法详解,并转换成代码的形式)
  17. 一款开源的协作文本编辑器
  18. Java自动生成日历,移除节假日和周六日
  19. 区块链开发之Metamask使用调研
  20. 电磁兼容(EMC)基础(二)

热门文章

  1. python中def和return是必须使用的保留字吗_Python 保留字和关键字的用法
  2. Java交流|面试最后一问:你有什么问题想问我吗?
  3. linux accept过程,Linux协议栈accept和syn队列问题
  4. php复制整个文件夹,PHP实现递归复制整个文件夹的类实例
  5. 双路服务器只显示一半内存,双路服务器只显示一半内存
  6. jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项
  7. leetcode718. 最长重复子数组
  8. leetcode1047. 删除字符串中的所有相邻重复项
  9. [Nginx]负载均衡和动静分离
  10. [C++11]不允许使用auto的四个场景