摘要:
代码: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define int long long using namespace std; const int N=1000000,M=9982443 阅读全文
摘要:
这个题BST考场爆切然后教我的,%%%。 首先我们发现生成的数列一定是原序列的一个子序列,然后有要求本质不同的序列个数,这就让我们往子序列自动机上靠。我们先看一下对 \(a_i,a_{i+1}\) 操作的几种不同的后果: \[ 00\to 0\\ 01\to 1\\ 10\to 1\\ 11\to 阅读全文
摘要:
代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define int long long using namespace std; const int N=3000,M=998244353; 阅读全文
摘要:
这道题的字符集是 \(O(n)\) 的,正常的子序列自动机时空复杂度都无法接受。 所以我们考虑用 \(vector\) 来代替这个过程。用 \(vector\) 记录每个字符出现的位置,然后进来一个字符就二分这个字符下一次出现的位置。时间复杂度 \(O(nlogn)\)。 代码: #include< 阅读全文
摘要:
OI Wiki 子序列自动机的每个状态表示当前位置结尾的字符串中第一次出现的字符串。状态数 \(n+1\) ,转移数 \(O(n\times \sum)\),其中 \(n\) 为字符串长度,\(\sum\) 为字符集大小。 应用 判断一个字符串是否是另一个字符串的子序列 对第二个序列建立子序列自动机 阅读全文
摘要:
最小表示法模板题: 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=300009; int n,a[N]; void init 阅读全文
摘要:
OI WIki 找出一个字符串的最小循环同构,就是最小表示法。 由于我们只想要找到最小的,所以可以用打擂台的方式进行筛选。但是如果每个串都逐位比较的话,发现会被 \(aaa\cdots aab\) 这样的数据轻松卡成 \(O(n^2)\)。 考虑优化,我们发现如果有两个相同的很长的子串,复杂度就难以 阅读全文
摘要:
还是求几个串的最长公共串。 但是由于数据范围的原因,用后缀数组可能会T,所以现在介绍一种后缀自动机的解法。 首先考虑两个串的公共串怎么求(假设分别为 \(S\)、\(T\))。对 \(S\) 建立后缀自动机,把 \(T\) 放在后缀自动机上跑,如果没有转移就跳后缀 \(link\)。然后在每个节点记 阅读全文
摘要:
对最外层所有叶子编号(编号都为 $1$),然后把他们删去,然后给倒数第二层叶子编号(编号都为 $2$)。以此类推。 对于每一种编号考虑,由于一条路径最多只能覆盖两个编号相同的节点,所以最后答案为 \(\sum\limits_{i=1}^{k}\max(2\times L,sum[i])\)。其中 \ 阅读全文
摘要:
对 \(T\) 的每个位置进行考虑。 设 \(f_i\) 表示以 \(T\) 的第 \(i\) 个位置结尾的字符串(\(S_k\))的个数 设 \(g_i\) 表示以 \(T'\) 的第 \(n-i+1\) 个位置结尾的字符串(\(S_k'\))的个数(其中 \(T'\) 表示 \(T\) 的反串, 阅读全文