多项式简单应用
求\(\displaystyle\sum_{i=0}^na_i \cdot b_i\)
对于求\(\displaystyle\sum_{i=0}^na_i \cdot b_i\) 把b数组翻转一下, 等价于求\(\displaystyle\sum_{i=0}^na_i \cdot b_{n-i}\), 这不就是一个卷积嘛, 时间复杂度\(\Theta(nlog_n)\)
你可能会说时间复杂度变得更差了,还带了大常数, 别急, 它在求解许多个乘机时有妙用
如求
\[Max_{j=0}\{\displaystyle\sum_{i=j}^{j+n-1}a_i \cdot b_{i-j} \}
\]
其中a和b是两个数组, b数组的长度是n, 你想求从a的每一个位置开始,与b按位相乘的最大值
如果按照上面的做法, 设:
\[c_j = \displaystyle\sum_{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
对于从某个位置开始匹配, 如果按位相乘\(\displaystyle\sum_{i=0}^na_i \cdot b_i\) 所得不就是b和a有多少位置都是c嘛, 如果枚举所有字符,并将答案相加,如果恰好等于n,那么说明完全匹配上了
这个是可以用我们上面提到的多项式优化的