Links there:PKUSC2018-神仙的游戏
先向考场只做了18分的我凭吊.
上次考完听说这是个多翔式的题,但似乎一直忘了去思考为什么…所以就当补上了吧.
题意
给出一个由 $0$ , $1$ , $?$ 构成的串 $s$ .问号可以换成 $0,1$,现在定义$f(len)$ 表示 $s$ 中长度为 $len$ 的前缀是否能够成为$border$,如果是则值为$1$,否则为$0$.
求异或和
思路
寻找所谓的$border$的性质,如果对于一个长度为$len$的border存在,当且仅当
$\forall i∈[1,n−len]$ 有 $s[i] = s[n-len+1]$
等价于在Mod $n-len$的意义下分组,每一组的所有01必须相同。
那么对于每一对01来说对于任意的$x,x|(pos_0 - pos_1)$都不可行.
考虑求出所有的$(pos_0 - pos_1)$然后暴力枚举他的倍数就行啦,复杂度是$O(n lnn)$
考虑构造这样两个生成函数
$f1(x)=\sum{i=0}^{n}[s_i== 0] x^i$
$f2(x)=\sum{i=0}^n[s_{n-i}==1]x^i$
构造卷积$f_1 * f_2 = f_3$
在$f_3$中发现$pos_0-pos_1$对应的就是$pos_0-pos_1+n$
$NTT$优化后在$f_3$中统计答案就行啦.复杂度是$O(nlogn)$,这也是总复杂度.
果然是神仙的游戏!
Code
1 | //my vegetable has exploded. :( |