多项式简单应用

\(\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,那么说明完全匹配上了

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

题目:

posted @ 2020-02-07 00:35  Hs-black  阅读(366)  评论(0编辑  收藏  举报