SP8093 JZPGYZ - Sevenk Love Oimaster
- 给出 \(n\) 个模板串 \(s_1\sim s_n\) 和 \(m\) 个查询串 \(t_1\sim t_m\),每次询问一个查询串是多少个模板串的子串。
- \(n\le 10^4\),\(m\le 6\times 10^4\),\(\sum\limits_{i=1}^n|s_i|\le 10^5\),\(\sum\limits_{i=1}^m|t_i|\le 3.6\times 10^5\)。
先将所有字符串用奇怪字符拼成一个大串 \(S\) 然后做一遍后缀排序,求出 \(sa,rk,\text{height}\) 等数组。
对于每一个询问串,以它为前缀的后缀的排名一定是一个区间,考虑二分出这个区间 \([L,R]\)。
我们记排名为 \(i\) 的后缀的颜色 \(col_i\) 为它是哪个模板串的后缀。则要求区间 \([L,R]\) 内有多少种不同的颜色。
主席树维护每一个位置的前驱,数有多少个前驱在区间外即可。但是询问串之间也可能存在包含关系,所以要数的颜色必须是 \([1,n]\) 内的颜色。
因此主席树的一个节点的定义为:当前版本中,有多少个位置满足这个位置的颜色在 \([1,n]\) 内,且该位置的前驱在该区间内。插入的时候,若当前位置的颜色在 \([1,n]\) 内则插入,否则继承上一个版本。
时间、空间复杂度均为 \(\mathcal{O}(|S|\log |S|)\)。

浙公网安备 33010602011771号