7.31做题笔记
字符串
BZOJ4979 字符串大师
根据 $p_i$ 可以得出 $kmp$ 数组
模拟 $kmp$ 过程
可以得到字符相等或不等关系
done
LOJ 10035
模板。。。
[NOI2014] 动物园
求出 $fail$ 数组
匹配过程中同时维护一个小于等于 $n/2$ 的指针
统计答案即可
[NOIP2020] 字符串匹配
枚举循环节 $AB$ ,用 exkmp 可以快速算出这个循环节最远延伸到哪
那剩下部分就是 $C$
然后发现,对于同一个循环节,$C$ 中出现奇数次的字符只有两种(奇数/偶数个循环节)
用一个数组 $p_i$ 表示 $i$ 后有几个出现奇数次的字符
那对于循环节,统计出现奇数次的字符的个数小于 $p_i$ 的字符串有几个
用线段树维护
LOJ10059
建AC自动机,跑的时候把每个字符压到栈里,并记录在自动机上的哪个状态,删的时候,弹栈即可
*[NOI2011] 阿狸的打字机
把询问离线
Luogu4555
先跑manacher
枚举划分点
线段树维护
Luogu4287
建出PAM之后,方法类似于动物园
拿一个指针记$|S|/2$的串在哪就行
K-palindrome String
建PAM,记录$|S|/2$的串在哪,符合条件的话$dp$值,可以从那里转移
Luogu4762
建PAM
跑DP
从 $border$ 处转移$dp_i=dp_{border_i}+n-len+1$
LOJ2377
求后缀数组后
$lcp$用单调栈维护即可
LOJ2083
要求出以 $i$ 结尾的AA的数量 $f_i$,以及以$i$开头BB数量$g_i$
枚举A的长度$len$,以$len,2len,3len...$作为关键点
对每个关键点,看他最远向前延伸几个满足延伸的部分和后一个关键点延伸的部分相同
再看向后延伸
发现A只要前端点在前延伸区间内,后端点在后延伸区间内,就满足条件
用差分数组更新一下 $f,g$ 就行了
延伸部分长度跑两次后缀数组,求lcp就行了
洛谷P5028
SAM会被卡...
把每个字符串拼起来,跑后缀数组
$ans_{x,y}$ 表示 $x,y$ 字符串的最长公共子串
假设当前处理到$i$,对应的字符串是$x$
考虑对 $ans_{x,y}$ 的贡献,肯定会找到离$i$最近的$j$,使得 $j\in S_y$
复杂度$O(n|S|)$
LOJ2133
求后缀数组后
又是单调栈
后缀自动鸡
只会模板。。。

浙公网安备 33010602011771号