FFT的应用
概述
FFT的模板很简单,大家都会背,于是出题的空间就在于建模了。FFT的题目难在建模,往往需要将问题抽象出来,经过一系列转化后得到乘积式的和,再赋予式子各个项的系数一定的意义即可。
基本形式
对于类似\(\sum_{i+j=N+k}a_ib_j\)的式子,可以直接通过FFT计算。
其中N是定值,表示元素个数;k是变量,是题目中的系数,a和b是间接已知数组,当a与b的系数和为定值时,可将一个翻转,否则直接计算。
例题:P3723?[AH2017/HNOI2017]礼物
直接计算卷积
一些问题经过简单的推导即可推出可以用计算卷积来解决,这类问题多形如对所有不大于\(n\)的\(k\)求出某个东西,其中\(k\)的答案为求某个卷积后结果数组的第\(k\)项。
例题:CF993E
给出一个大小为\(n\)的数组\(a\)和一个数\(x\),对于\(0\)和\(n\)之间的所有\(k\),求有多少个\(a\)的区间中恰有\(k\)个数小于\(x\)。
\(1\leq n\leq 2 \times 10^5, -10^9\leq x,ai \leq 10^9\)
多项式运算
多项式乘法可以用来表示卷积,而借助多项式的性质,可以分析并解决类型更为广泛的问题。其中,最典型的例子是利用生成函数解决组合计数问题,这往往可以简化推导过程,有时还可以借助专用算法优化复杂度。
字符串匹配
代通配符的字符串匹配
设\(s,t\)为字符串,其中\(t\)中某些字符是通配符,可以匹配任意字符,求\(s\)在\(t\)中的所有匹配的位置。将通配符设为\(0\),其余字符设为非\(0\)的数,则\(s\)在\(k\)处匹配当且仅当
\[\sum_{0\leq i < |s|}t_{i+k}(s_i-t_{i+k})^2=0\]
结合计算卷积,很容易算出左式,即可完成匹配
模板:P4173 残缺的字符串
要求匹配两个字符串A,B,两者都有通配符
\[\sum_{0\leq i < |s|}t_{i+k}s_i(s_i-t_{i+k})^2=0\]
例题:CF528D Fuzzy Search
给出字符串\(s,t\)和非负整数\(d\),求有多少个\(k\),满足对于所有\(s\)的下标\(i\),都存在距离\(k+i\) 不大于\(d\)的\(j\),使得\(s_i = t_j\)。\(1\leq |s|,|t|, k\leq 2\times 10^5\),字符集大小为\(4\)。
原文地址:https://www.cnblogs.com/guoshaoyang/p/11296027.html