摘要: 这道题的字符集是 \(O(n)\) 的,正常的子序列自动机时空复杂度都无法接受。 所以我们考虑用 \(vector\) 来代替这个过程。用 \(vector\) 记录每个字符出现的位置,然后进来一个字符就二分这个字符下一次出现的位置。时间复杂度 \(O(nlogn)\)。 代码: #include< 阅读全文
posted @ 2020-07-30 16:33 With_penguin 阅读(110) 评论(0) 推荐(0)
摘要: OI Wiki 子序列自动机的每个状态表示当前位置结尾的字符串中第一次出现的字符串。状态数 \(n+1\) ,转移数 \(O(n\times \sum)\),其中 \(n\) 为字符串长度,\(\sum\) 为字符集大小。 应用 判断一个字符串是否是另一个字符串的子序列 对第二个序列建立子序列自动机 阅读全文
posted @ 2020-07-30 16:30 With_penguin 阅读(744) 评论(0) 推荐(0)
摘要: 最小表示法模板题: 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=300009; int n,a[N]; void init 阅读全文
posted @ 2020-07-30 13:23 With_penguin 阅读(124) 评论(0) 推荐(0)
摘要: OI WIki 找出一个字符串的最小循环同构,就是最小表示法。 由于我们只想要找到最小的,所以可以用打擂台的方式进行筛选。但是如果每个串都逐位比较的话,发现会被 \(aaa\cdots aab\) 这样的数据轻松卡成 \(O(n^2)\)。 考虑优化,我们发现如果有两个相同的很长的子串,复杂度就难以 阅读全文
posted @ 2020-07-30 13:21 With_penguin 阅读(151) 评论(0) 推荐(0)