cf827e-solution
CF827E Solution
题意:给你一个长度为 \(n\),且某些字符残缺的字符串。试问对于每个 \(k\in[1,n]\),是否存在一种确定残缺字符的方案,使得 \(k\) 是得到的串的周期。
周期的定义:\(k\) 是串 \(s\) 的周期当且仅当 \(\forall i\in[0,n-k-1],s_i=s_{i+k}\)。
前置知识:FFT 字符串匹配。
对于一般的字符串匹配,我们知道 \(s_i\) 和 \(t_j\) 匹配意味着 \(s_i=t_j\) 即 \(s_i-t_j=0\)。
那么 \(t\) 能够匹配 \(s\) 中以第 \(x\) 位结尾的 \(m\) 个字符当且仅当 \(\forall i\in[0,m-1],s_{x-m+1+i}=t_i\)。
接下来我们设匹配函数 \(f(x)=\sum_{i=0}^{m-1}(s_{x-m+1+i}-t_i)^2\),
若 \(f(x)=0\),运用初中知识可得 \(\forall i\in[0,m-1],s_{x-m+1+i}=t_i\)。
要快速求多个 \(f(x)\),我们熟练地反转串 \(t\) 得到串 \(r\),那么
你发现 \(s,r\) 的下标之和为 \(x\),那么 \(f(x)\) 显然可以 FFT/NTT 快速计算。
对于这题,类似地,设万能符的值为 \(0\),那么 \(s_i\) 和 \(s_j\) 匹配意味着 \(s_i=s_j\lor s_i=0\lor s_j=0\)。
那么 \(x\) 为周期当且仅当匹配函数 \(f(x)=0\),其中 \(t\) 为 \(s\) 反转后的串,\(f(x)\) 为
到这里已经可以卷积计算。可是考虑以下情况
V ? K
V ? K
这里的问号不能同时取 V 和 K,于是这种情况是不合法的。
注意到不合法情况的 \(k\) 均小于 \(\frac n 2\)(问号重叠)。
我们知道周期有性质:若 \(k\) 是字符串 \(s\) 的周期,则 \(k\) 的所有倍数都为 \(s\) 的周期。
具体地,如果 \(k\) 是 \(s\) 的周期,那么我们有 \(\forall i\equiv j\pmod k,s_i=s_j\)。就像这样
ABCABCABCABC
ABCABCABCABC
现在我们考虑一个周期 \(k\),它不是合法周期但是由于万能符错误匹配导致算进了答案。比如样例1,\(k=2\):
V??VK
V??VK
这时我们知道 \(\forall i\equiv j\pmod 2,s_i=s_j\)。
可是一看,\(1\equiv5\) 但 \(s_1=V,s_5=K\)。
这意味着两个不相同的字符通过万能符相等了。这说明 \(k\) 的倍数中总有一个周期原先就不合法,样例中是 \(k=4\)。
V??VK
V??VK
thus,由于万能符错误匹配导致多算的周期一定有一个倍数是不合法的。
那么想要删去这些错误匹配的漏网之鱼,我们只需要枚举所有合法周期 \(k\) 的倍数 \(\lambda k\),检验它们是否都为合法周期,如果有不合法的那么 \(k\) 就是漏网之鱼。
由于漏网之鱼的长度小于 \(\frac n 2\),因此它一定存在不合法的倍数。
复杂度线性对数。

浙公网安备 33010602011771号