P4173 殘缺的字串 FFT

2022-03-29 05:55:27 字數 951 閱讀 2374

給出兩個字串\(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的每乙個位置就包含了 所有原來一定偏移量的位置的乘積和。對於這個題,我們只需要找到一種方法,使相同的字元代表...