[NOIP2020] 字符串匹配
枚举前缀 \(AB\) 和 \(i\),kmp 判断是不是周期串。
[COCI2016-2017#4] Rima
押韵条件:
- 第一位不一样
- 去掉第一位
trie 树扫一扫。
[POI2010] ANT-Antisymmetry
重载马拉车。
[USACO15FEB] Censoring G
ac 自动机,加个回退操作。
[POI2012] PRE-Prefixuffix
形如 \(ABCBA\)。枚举 \(A\),哈希二分最长 \(B\)。
[JSOI2012] 玄武密码
建 SAM 无脑跑
「JZOI-1」拜神
先跑 SA。
二分长度 \(L\),check 就看有没有 \(\text{lcp}>=L\) 的。
放到 SA 上相当于从大到小扫 height,每次合并两边的块,求 \(L\) 这个版本区间内是否存在两个数在相同块中。
先看后面的问题,我们可以维护每个版本每个位置在序列上是同一个块的后继,存在就变成区间最小值在区间内,这可能可以主席树。
然后就是如何合并两个块,容易想到启发式合并。set 维护每个块中的点,每次合并更新主席树。接着处理询问,就是在主席树上查区间最小值。这是两只老哥的。
String Journey
首先,答案是 \(\sqrt n\) 级别的,因为是等差数列求和。
然后我们发现,一定存在一种最优解满足每个串是上一个串长度 \(-1\)。调整法不难证明。
那么倒着确定方案,即从小到大枚举长度。维护 \(f_{i,j}\) 表示位置 \(i\) 是否存在方案使他后面选了 \(j\) 个串。转移考虑新字符插入前面还是后面,维护哈希即可。