摘要:
乱搞 看到 \(n=1e5\) ,时限3s,存在修改操作,很自然的想到根号分治。 考虑按照时间分治。对每 \(B\) 个交换统一处理, \(B\) 个交换最多有 \(2B\) 个元素改变状态,剩下都不变。那么只要对这 \(2B\) 元素内,暴力枚举,剩下的元素构建数据结构实现二维数点,平面内区间最值 阅读全文
2024年8月9日
2024年8月6日
摘要:
乱搞 非正解写法。分类讨论各种情况。 降序排序 对应交换即可 数组个数小 直接考虑相邻的交换 其他都看做随机数据 考虑结合前面情况,很容易想到,先把数组变成一个尽量有序的数组(每个元素和自己正确的位置相差不大)。最后再多次相邻交换,使得每个元素都在正确位置。 把数组变成一个尽量有序的过程,很容易想到 阅读全文
2024年7月24日
摘要:
wcz在2022年集训队论文《浅谈与Lyndon理论有关的字符串组合问题》中做过详细介绍,由于笔者太菜,这里只做简单介绍,并且不做证明。 Lyndon 分解 Lyndon串:对于字符串\(s\),如果\(s\)的字典序严格小于\(s\)的所有后缀的字典序,我们称\(s\)是Lyndon串。 Lynd 阅读全文
2024年7月23日
摘要:
manacher 马拉车通过在每个字符间插入一个特殊字符,使得字符串长度为奇数,从而保证每个字符都有中心。在每个中心记录回文串的长度。 马拉车的扩展方式和\(Z\)函数类似。都是通过映射之前已经算过的位置,然后尽可能的向右扩展。复杂度\(O(n)\) 通常马拉车的题目统计回文串需要与其他数据结构结合 阅读全文
摘要:
终于来到大名鼎鼎的后缀结构了,后缀结果可以解决许多子串问题。后缀结果是字符串经常考察的点,需要重点学习。 SA 后缀排序,是指这个对字符串\(s\)的每一个后缀字符串进行排序,通过处理每个后缀的前缀来解决子串问题。\(SA\):排名为\(i\)对应原字符串下标,\(rk\):下标为\(i\)的后缀排 阅读全文
2024年7月22日
摘要:
最小表示法 字符串 \(S\) 的最小表示为与 \(S\) 循环同构的所有字符串中字典序最小的字符串。 一般用于判断两个字符串是否循环同构。只需要都用最小表示,然后判断即可。 考虑如何构造。这里oiwiki解释的很清楚。就不做过多解释了。复杂度\(O(n)\) int i = 1, j = 2, k 阅读全文
摘要:
序列自动机 判断字符串\(s\)是否存在序列\(t\)。只需要记录这个位置,后面每个字符出现的最早位置即可\(nxt\)。 求子序列个数 记忆化搜索\(f[x] = \underset {y \in x'son}{\sum} f[y] + 1\) 求两串的公共子序列个数 两个串的记忆化搜搜\(f[x 阅读全文
摘要:
即在trie上kmp。AC自动机是一种多模式串匹配算法,用于在一个文本串中查找多个模式串。 注意到,AC自动机的\(fail\)也构成了一个树形结构。我们只需要在操作完进行一个离线拓扑排序就不用每次匹配到一个点,暴力跑完所有fail确认是哪些模式串。 struct AC { vector<int>e 阅读全文
摘要:
Z函数可以在\(O(n)\)时间内求出自己的所有后缀和本身的LCP(最长公共前缀),和任意字符串\(T\)和其的LCP。 原理就是考虑之前的lcp,可以通过之前的lcp这一位和前缀某一位一致,对应到前缀某一位的LCP,再向右扩展。注意到,右边界最多被扩展1次所以是线性复杂度。 struct Z { 阅读全文
摘要:
Shift And 一种暴力字符串匹配算法,用bitset优化。复杂度\(O(N*M/w)\) 用\(p\)记录当前匹配第几位是成立的,\(skip\)记录字符是\(c\)的有哪些位置。匹配时,\(p\)中第\(k\)位置是成立的,且下一位正好是\(skip\)对应的字符。那么下一位成立。 bits 阅读全文