Frequency of String
对于多串匹配问题,考虑建出来AC自动机。
然后只要处理出来每个串在模式串中出现的位置就可以统计答案。
所以将(S)扔到AC自动机上暴力匹配,更新fail树上祖先包含的串的出现位置集合。
由于保证了串两两不同,所以一个节点的祖先链上最多只有(O(sqrt(n)))个串。
Xenia and String Problem
首先这道题有个性质是合法的字符串长度是固定的,只有log种。所以可以对每种长度的字符串计算贡献。
考虑修改每个字符产生的贡献,分成减少的和增加的。
首先用hash找到所有合法的字符串,然后在对应位置差分可以维护出修改每个位置时减少的贡献。
对于增加的贡献,枚举所有位置和长度,判断是否存在只修改一个字符使这个串合法的方案。
最后对每个点的贡献取(max)即可。
Periodicity
文本校正
字符串
题目中的限制条件可以转化为(lcp+lcs+k>=len),于是可以考虑枚举每个串的每个(lcp),统计合法的(lcs)个数。
考虑一个串可能被计算多次,那么只要计算最长的lcs。
由于同时出现了lcs和lcp,所以可以考虑对正串和反串同时建出AC自动机,然后将S的正串和反串分别放在AC自动机上匹配。
那么对于一个前缀节点a,S出现在这个位置的集合就是fail树子树中所有的出现位置。
所以只要找到这个前缀节点a对应的后缀节点,统计后缀节点b的fail树子树中所有位置与前缀节点位置对应的数的个数。
比较简单的实现方法是差分,即在进入b子树时统计一次答案,遍历完子树后再统计一次即可。
毒瘤题加强版再加强版
假装这是个字符串题。
出现奇数次我们可以想到异或,所以我们需要考虑一种方法让每种出现次数为奇数的数都有一种与其他数不相关的异或和。
做法是:选取若干个质数,然后对于每个数,将其对每个质数取模后在对应的桶异或上这个这个数的hash值。
然后暴力扫一遍每个质数的每个桶,若能够判断这个桶只有一种数,那么累加答案。
计算几何瞎暴力
由于有全局异或这个东西,所以考虑建出trie树。
对于有序的部分维护一个trie树,无序的部分维护前缀和,那么区间查询操作就可以在trie上二分出对应的子树,维护trie树子树内的权值和即可,无序部分直接查询前缀和。
排序操作直接将无序部分暴力插入trie树。
全局异或操作可以考虑在全局维护标记,或者直接给trie打标记。
节日庆典
Upside Down
封印
对T建SAM,处理出来S的每个前缀在T中的匹配长度,然后对于询问二分答案,查询一段区间最大值即可。