首页 > 其他分享 >CF1037H Security 做题记录

CF1037H Security 做题记录

时间:2023-12-01 20:44:25浏览次数:44  
标签:字符 le LCP 记录 后缀 text CF1037H str Security

搬的学习笔记,之前没想过要新开一篇。

题目传送门(CF)

  • 给出一个字符串 \(s\),有 \(q\) 次询问,第 \(i\) 次询问给出 \(l_i,r_i,t_i\),求一个字典序最小的字符串 \(str\),使得它是 \(s[l_i,r_i]\) 的子串,且 \(str>t_i\)。

  • \(|s|\le 10^5\),\(\sum\limits_{i=1}^q|t_i|,q\le 2\times 10^5\)。

记 \(|\text{LCP}(str,t_i)|=l\),\(str>t_i\) 当且仅当 \(str_{l+1}>t_{i_{l+1}}\),为了使 \(str\) 尽量小,我们希望 \(\boldsymbol l\) 尽量大

证明很简单,假设有一个串 \(T\) 满足 \(\text{LCP}(T,t_i)=L<l\),则 \(\bf {LCP}\boldsymbol{(str,T)=L}\),且 \(\boldsymbol{T_{L+1}>str_{L+1}}\),因此 \(\boldsymbol{T>str}\),所以 \(\bf{|LCP|}\) 大的字符串字典序更小

先将 \(s\) 和所有 \(t_i\) 中间用奇怪字符拼接成大串 \(S\),这样不改变任意两个后缀的 \(\text{LCP}\)。然后做一遍后缀排序,求出 \(sa,rk,\text{height}\) 数组以及维护 ST 表辅助求后缀之间的 \(|\text{LCP}|\)。

对于每一组询问,考虑枚举 \(l\,(0\le l \le r_i-l_i)\) 以及下一位拼上什么字符 \(c\),满足 \(c>t_{i_{l+1}}\)(一定是仅拼上一个字符,因为空字符字典序最小)。可以先二分 + ST 表求出与 \(t_i\) 在 \(S\) 中的后缀的 \(|\text{LCP}|\) 至少为 \(l\) 的后缀排名区间 \([L,R]\)。那么在 \(\text{LCP}\) 末尾拼上一个字符 \(c\) 后(记这个字符串为 \(p\)),以 \(p\) 为前缀的后缀的排名仍然是一个连续的区间。由于后缀排序过,因此 \([L,R]\) 排名区间内的后缀的第 \(l+1\) 位的字符一定单调不减

考虑继续二分出这个连续区间 \([ql,qr]\),可以二分找到最小的排名 \(mn\) 使得 \(S_{sa_{mn}+l}\ge c\) 以及最大的排名 \(mx\) 使得 \(S_{sa_{mx}+l}\le c\)。则 \(ql=mn,qr=mx\)。若不存在 \([ql,qr]\) 这个区间,则跳过。

我们要求 \(s[l_i,r_i]\) 中是否存在一个子串 \(str\) 以 \(p\) 为前缀,相当于求 \(suf_{l_i}\sim suf_{r_i-l}\) 这些后缀中,是否存在一个后缀 \(suf_j\) 使得 \(ql\le j\le qr\)。至此原问题转化成了二维数点,用主席树维护即可。

可以从小到大枚举 \(c\),对于枚举的 \(l\),我们找到一个最小的字符 \(c\) 满足条件之后,即可停止当前 \(l\) 的枚举。因为要求字典序最小。

对于多种 \(l\) 的答案,上面已经说过,选最大的那一种。

默认 \(|S|,q\) 同阶,时间复杂度为 \(\mathcal{O}(|\Sigma|\cdot (\sum_{i=1}^q|t_i|)\log |S|+|S|\log^2 |S|)\),空间复杂度为 \(\mathcal{O}(|S|\log |S|)\)。由于不是瓶颈,后缀排序部分未使用基数排序优化。

提交记录(含代码)

标签:字符,le,LCP,记录,后缀,text,CF1037H,str,Security
From: https://www.cnblogs.com/MnZnOIerLzy/p/17870835.html

相关文章

  • 记录--原来前端部署这么简单
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言有个朋友说前端技能大家大部分都会,就是部署项目这一块经验都比较稀缺,一直很想学一下。所以在这里写一篇简单的从零开始部署前端项目的全过程,感兴趣的掘友们或者想自己搭建项目部署的可以看一下这篇。环境搭......
  • pytorch 学习记录——计算图
    1.pytorch的计算图是动态更新的(tensorflow是静态计算图),数据流向可以是双向的。2.pytorchvariable(用于封装tensor,便于自动求导的变量类型,在pytorch0.4.0之后版本已被并入tensor)基本属性:data,dtype,shape,device,requires_grad,is_leaf,grad,grad_fn3.is_leaf是否为叶子节点:用户创......
  • 问题记录 <Latex 使用bibliography命令,引用文献中包含中文生僻字>
    问题描述LaTeX使用\bibliography和.bib设置参考文献时,中文生僻字无法显示。解决方式下载字体;将simsun.ttf文件放到.tex同一文件夹下;导言部分添加:%%解决生僻字问题,使用自定义命令\usepackage{ctex}\setCJKfamilyfont{myfont}{simsun.ttf}\newcommand{\MyFont}{\CJKfamil......
  • QT-对于MVC中典型QTreeView简单使用参考记录
    //创建以ui文件中对应View为载体的model<-此处使用QStandardItemModel(比较常用)QStandardItemModel*model=newQStandardItemModel(ui->treeView);model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("国家")<<QStringLiteral("省份"......
  • AOP-@Around环绕增强-理解问题-测试-记录
    来源自定义注解测试切面环绕时,接口测试返回空白。理解关键在于:环绕增强后走的是切面类中的方法,你不给返回值(习惯void)就是空白=-=。@Around它可以包围一个方法或函数的执行,并在执行前后提供额外的逻辑。使用@Around注解,你可以定义一个通知(advice),该通知在目标方法执行之前和......
  • 使用 logger 命令记录工作日常
    配置指定local6.warning写到日志文件/var/log/work.log,命令:echo"local6.warning/var/log/work.log">/etc/rsyslog.d/55-work.conf重启服务systemctlrestartrsyslog测试命令logger-plocal6.warningaaa验证cat/var/log/work.log,显示如下:Dec111:41:2......
  • i18n使用记录
     ......
  • airScript学习记录2
    ###元组就是不能修改的列表,用()##a=(2,3,432,'adfa')##print(a[3])###修改元组,,把元组转化为列表,用内置函数list()##s=list(a)##s[3]='baba'##print(s[3])##字典可以存储任意数据类型##字典是以键值对的形式存在,键一般是不重复的,如果重复,最后一个值会替代前......
  • linux学习记录(tmux、vim) 9.23
    tmux和vim1、tmux(1)分屏(2)允许把terminal断开之后,继续运行top命令,类似windows的任务管理器,显示各进程运行状况写一个文档或者代码的时候,在tmux里面写,不用担心断网tmux开一堆---->session开一堆(常用)---->window开一堆---->pane(常用)---->shell每一个pane都会打开一......
  • 记录--组件阅后即焚?挂载即卸载!看完你就理解了
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言上家公司有个需求是批量导出学生的二维码,我一想这简单啊,不就是先批量获取学生数据,然后根据QRcode生成二维码,然后在用html2canvas导出成图片嘛。由于公司工具库有现成的生成压缩包方法,我只需要获得对应的图片b......