多项式简单应用

(displaystylesum_{i=0}^na_i cdot b_i)

对于求(displaystylesum_{i=0}^na_i cdot b_i) 把b数组翻转一下, 等价于求(displaystylesum_{i=0}^na_i cdot b_{n-i}), 这不就是一个卷积嘛, 时间复杂度(Theta(nlog_n))

你可能会说时间复杂度变得更差了,还带了大常数, 别急, 它在求解许多个乘机时有妙用

如求

[Max_{j=0}{displaystylesum_{i=j}^{j+n-1}a_i cdot b_{i-j} } ]

其中a和b是两个数组, b数组的长度是n, 你想求从a的每一个位置开始,与b按位相乘的最大值

如果按照上面的做法, 设:

[c_j = displaystylesum_{i=j-n+1}^{j}a_i cdot b_{i-(j-n+1)} ]

所求就是c数组n以上的项的最大值, 到这已经可以解决一些题目了, 如礼物

如果应用到字符串问题上呢?

有字符串s和t, 假设他们只有四种字符, 求t在s中所有出现的位置

妈妈我会KMP, KMP显然可以(O(n))解决,但是它太优秀了,所以我们要一个(Theta(nlog_n))的算法

一个一个字符考虑, 比如字符c,温两个多项式,在原串中此位置是否为c, 是为1, 否为0

对于从某个位置开始匹配, 如果按位相乘(displaystylesum_{i=0}^na_i cdot b_i) 所得不就是b和a有多少位置都是c嘛, 如果枚举所有字符,并将答案相加,如果恰好等于n,那么说明完全匹配上了

这个是可以用我们上面提到的多项式优化的

题目:

原文地址:https://www.cnblogs.com/Hs-black/p/12271688.html