背景:
FFT的字符串假题。
题目传送门:
https://www.luogu.org/problemnew/show/P4173
题意:
定义
∗表示一个任意字符,求一个字符串从哪里开始能在模式串完全匹配。
思路:
考虑转化为数字问题。
另
0表示
∗,
1表示字符
a,
2表示字符
b…
考虑一一对应。
那么假设两个位置匹配,就会有
∣ai−bi∣=0或
ai=0或
bi=0,就可以表示为:
(ai−bi)2aibi=0
展开化简得:
ai2∗aibi+bi2∗aibi−2aibi∗aibi=0
ai3bi+aibi3−2ai2bi2=0
不妨设
b′为
b反向取后的序列,则有:
ai3bn−i+aibn−i3−2ai2bn−i2=0
发现是三个
FFT卷积的形式,不妨用
FFT来加速即可。
代码: