题目

传送门 to LOJ

传送门 to luogu

题目概要
对于字符串 SSS 的每个前缀,求出循环移位后可以得到的最小字典序,输出向左的循环移位长度。如果有多个,输出最小的向左循环移位长度。

数据范围与提示
∣S∣≤3×106|S|\le 3\times 10^6∣S∣≤3×106 。

思路

字典序的变化其实并不复杂。就像区间字典序最大子串一样,从前缀 iii 变为前缀 (i+1)(i{+}1)(i+1) 时,方案的变动很小。

沿用那道题的方法,枚举右端点 rrr 的同时,想办法维护 可能有用的答案集合。考虑两个分界点 i,j(i<j)i,j\;(i<j)i,j(i<j) 是否有可能 “胜负已定” 。容易发现,当 lcp(S[i::],S[j::])≤r−jlcp(S[i::],S[j::])\le r-jlcp(S[i::],S[j::])≤r−j 时,无论 rrr 再怎么增大,二者的大小关系都确定了。所以
lcp(S[i::],S[j::])>r−j(i<j)lcp(S[i::],S[j::])>r-j\quad(i<j) lcp(S[i::],S[j::])>r−j(i<j)

继续照搬那道题,考虑 lcplcplcp 的传递性。若还有分界点 k(k>j)k\;(k>j)k(k>j) 满足 lcp(S[i::],S[k::])>r−klcp(S[i::],S[k::])>r-klcp(S[i::],S[k::])>r−k 的话,肯定也满足 lcp(S[j::],S[k::])>r−klcp(S[j::],S[k::])>r-klcp(S[j::],S[k::])>r−k 了。所以,只需要和首个分界点进行比对

可是糟糕的是,我们没法维护单调栈了。虽说我们也并不需要维护单调栈,因为本题是查询完整的前缀。不管怎么说,我们要想办法找到 稳定的大小关系。接下来这一步,是如何想到的,我也不知道了。我只能说明它是正确的。

当 j−i<r−jj-i<r-jj−i<r−j 时,不难发现 j−ij-ij−i 是 S[i::]S[i::]S[i::] 的一个周期。那么,可以考虑研究一下从 iii 开始、从 jjj 开始、从 j+(j−i)j+(j-i)j+(j−i) 开始,这三种情况。记这个周期为 A=S[i:j−1]A=S[i:j-1]A=S[i:j−1] ,非周期部分 B=S[2j−i:r]+S[1:i−1]B=S[2j-i:r]+S[1:i-1]B=S[2j−i:r]+S[1:i−1] ,三种情况分别对应
i:A+A+Bj:A+B+A2j−i:B+A+A\begin{aligned} i&:A+A+B\\ j&:A+B+A\\ 2j-i&:B+A+A \end{aligned} ij2j−i​:A+A+B:A+B+A:B+A+A​

其实你一看就知道 jjj 肯定没用,把 BBB 放中间,人不人鬼不鬼的。不过还是给一个严谨证明。设 AAB>ABAAAB>ABAAAB>ABA(必须严格大于,等于的时候答案为 iii),必然是 AB>BAAB>BAAB>BA ,后面同时接一个 AAA 得到 ABA>BAAABA>BAAABA>BAA 所以 2j−i2j-i2j−i 更优。

有了这个结论,我们就可以说明 r−i⩾2(r−j)r-i\geqslant 2(r-j)r−i⩾2(r−j) 进而说明 一共只有 log⁡r\log rlogr 个有用的点,暴力检查就可以得到答案。咋检查啊?因为 lcplcplcp 已经匹配到了底,所以就是求一个 lcp(S[x::],S[1::])lcp(S[x::],S[1::])lcp(S[x::],S[1::]) ,做一个扩展 KMP\tt KMPKMP 就行。(如果 xxx 又到了底呢?那 xxx 就变成了 S[1::]S[1::]S[1::] 啊!)

复杂度 O(nlog⁡n)\mathcal O(n\log n)O(nlogn) 完成了所有事情。

2022/8/19update\texttt{2022/8/19 update}2022/8/19 update:看到个线性做法,只 mark\rm markmark 下,不深究。

[JSOI2019]节日庆典相关推荐

  1. [JSOI2019]节日庆典(Z-algorithm)

    要想让一个位置作为最小循环,其必须是最小后缀,然后一个字符串的最小后缀不超过O(logn)个,于是维护备选集合即可. 然而要在O(n)复杂度求解,需要求出原串后缀与原串的LCP长度,需要用Z-algo ...

  2. 【LOJ】#3103. 「JSOI2019」节日庆典

    LOJ#3103. 「JSOI2019」节日庆典 能当最小位置的值一定是一个最小后缀,而有用的最小后缀不超过\(\log n\)个 为什么不超过\(\log n\)个,看了一下zsy的博客.. 假如\ ...

  3. 「JSOI2019」节日庆典 (Z-Algorithm)

    传送门 考虑一个后缀 Si...nS_{i...n}Si...n​,如果加上一个任意字符 ccc 可以使得 Si...ncS_{i...n}cSi...n​c 为字典序最小的后缀,那么将其称为好后缀, ...

  4. 【LOJ3103】「JSOI2019」节日庆典

    [题目链接] 点击打开链接 [思路要点] 考虑一种暴力维护候选点集的做法. 即,在字符串不断增长的同时,若已经可以确定 TiT_iTi​ 不再可能成为字典序最小的循环后缀,则将 iii 在候选点集中删 ...

  5. LOJ #3103. 「JSOI2019」节日庆典

    题意 给定字符串 \(S\) ,对于 \(S\) 的每个前缀 \(T\) 求 \(T\) 所有循环同构串的字典序最小的串,输出其起始下标.(如有多个输出最靠前的) \(|S| \le 3 \times ...

  6. 万圣节日丧尸变异头像生成流量主小程序开发

    万圣节日丧尸变异头像生成流量主小程序开发 每到节日庆典,各种头像小程序就火爆起来,每次都有新的小程序开始售卖,换汤不换药,比如今年国庆的渐变,去年圣诞的圣诞帽生成. 这些热点,你追累了吗? 看到群里靠 ...

  7. 三亚香格里拉一年一度海岛冬令营回归;三亚美高梅度假酒店将举办十周年庆典 | 全球旅报...

    三亚香格里拉一年一度海岛冬令营回归:"LooHoo噜吙部落"主题亲子活动全新升级,推出极具挑战及创意的"LooHoo噜吙部落"岛野探险冬令营.此次冬令营活动有以 ...

  8. 节日类非遗题材工笔人物画的创作实践 ——以《元日》系列作品为例

    摘要 工笔人物画是中国画的主要题材之一,节日类非遗题材是工笔人物画的一个重要分支.工笔人物画的题材非常丰富,但是以非遗题材为工笔人物画表现内容的作品并不是很多.古代工笔人物画有反映民俗文化内容的作品呈 ...

  9. [总结]2019年9月 OI学习/刷题记录

    从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...

最新文章

  1. 指定在此oracle主目录中配置,oracle11g卸载
  2. 一些WPF中的滤镜特效——Effect Library
  3. Azkaban编译和安装模式
  4. 如何下载anaconda python3.7_如何安装Anaconda和Python
  5. thinkphp的like用法
  6. python 文件及文件夹操作
  7. 【Java】 Java反射机制总结
  8. hdu 1818 It's not a Bug, It's a Feature!(位运算+bfs优先队列)
  9. MSSQL 事务,视图,索引,存储过程,触发器
  10. python基础之socket
  11. RDKit | 基于RDKit的随机SMILES的生成
  12. 小程序生成海报(java后端)
  13. 最新Handsome主题V6.0免授权版+Typecho内核
  14. HTML如何实现带有滚动条的文本框
  15. IO进程——系统IO与文件IO
  16. 把WinRAR默认压缩格式换为ZIP
  17. UML之Astah的基本使用教程-2
  18. 关于“华为”的大数据分析
  19. 0124:镂空三角形(C++)
  20. 用苹果 AirTag 下五子棋是什么体验

热门文章

  1. 总结几个比较常用的数学公式(新手入门)
  2. 服务器维护委托合同,服务器维护委托合同
  3. 国稻种芯百团计划行动 胡培松:问“道”俯首田间只为问“稻”
  4. “暴富”春联成爆款,定制“口罩”也时尚,这届年轻人过年姿势变了
  5. Ubuntu18 安装ROS-Melodic及常见配置
  6. 逻辑代数基础介绍——数电第二章学习
  7. latex中的各种数学字体宏包
  8. python写抖音网站_用Python生成抖音字符视频!
  9. 如何实时计算中证1000指数的主买/主卖交易量
  10. Android异常-android5.0以上网络请求失败-retry error, curr request is null