給出兩個字串\(s,t\),其中包含小寫字母和一些\(?\),\(?\)可以匹配任何字元。
求有多少個\(p\)使得\(t_=s_\)
如果不考慮\(?\),我們可以用做差法來匹配兩個字元,構造匹配函式
\[f(x)=\sum_^(t_i-s_)^2
\]這樣若\(f(x)=0\)證明它們在位置\(x\)處匹配。
但是現在有\(?\),也就是要跳過有\(?\)的位置,定義\(?\)的值為\(0\),然後改一下匹配函式
\[f(x)=\sum_^(t_i-s_)^2t_is_
\]展開二次項
\[f(x)=\sum_^t_i^3s_-2t_^2s_^2+t_is_^3
\]把\(t\)反過來就是\(\sum_^t_^3s_-2t_^2s_^2+t_s_^3\)
然後有三個式子卷積之後加起來就好了。
常數極大,開\(\text\)才能過。時間複雜度\(o(n\log n)\)
#include#include#include#include#include#define int long long
using namespace std;
const int n=1e6+2e5;
const double pi=acos(-1);
struct complex
};complex operator+(complex a,complex b)
complex operator-(complex a,complex b)
complex operator*(complex a,complex b)
struct polyf[3],g[3];
int n,m,r[n],k;
char s[n],t[n];
queueq;
void fft(complex *f,int op,int n)
P4173 殘缺的字串 FFT字串匹配
p4173 殘缺的字串 fft字串匹配 p4173 經典套路將模式串翻轉,將 設為0,設以目標串的x位置匹配結束的匹配函式為 p x sum a m 1 i b x m 1 i 2a m 1 i b x m 1 i 展開之後化簡為 p x sum a 3 i b j 2 sum a 2 i b 2 ...
洛谷 P4173 殘缺的字串 FFT
給定長度為 m 的模式串和長度為 n 的目標串,兩個串都帶有萬用字元,求所有匹配的位置。fft 帶有萬用字元的字串匹配問題。設模式串為 p 目標串為 t 將兩個串的內容都根據字母先後順序對映到 1 到 26 如果不帶有萬用字元,那麼 t 以第 k 位結束的長度為 p 的子串與 p 匹配時有 sum ...
洛谷 P4173 殘缺的字串
不知道xjb kmp可不可以做的說 假設下標都以0開頭 對於有一定偏移量的序列的 對應位置 匹配或者數值計算的題,這裡是有一種套路的,就是把其中乙個序列翻轉過來,然後卷積一下,所得到的新序列c的每乙個位置就包含了 所有原來一定偏移量的位置的乘積和。對於這個題,我們只需要找到一種方法,使相同的字元代表...