BZOJ4259 殘缺的字串 FFT

2021-08-14 08:31:57 字數 1026 閱讀 9392

如果我們把*看成

0 ,兩個串相等當且僅當∑a

ibi(

ai−b

i)2=

0。 答案要求的就是對於每個

t ,∑a

ibi+

t(ai

−bi+

t)2是否為0。 將a

翻轉, ∑a

n−ib

i+t(

an−i

−bi+

t)2=

∑a3n

−ibi

+t−2

∗a2n

−ib2

i+t+

an−i

b3i+

t對三項卷積分別fft即可。

為了卡常數,最後可以把三個東西加起來再idft,一共要做

7 次dft。

**:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1100000;

const

double pi=acos(-1);

int n,m,r[maxn],len,bit;

char s[maxn];

bool ok[maxn];

struct cd

cd(double xr,double xi)

cd operator +(cd a);}

cd operator -(cd a);}

cd operator *(cd a);}

cd operator *(double d);}

}a_1[maxn],b_1[maxn],a_2[maxn],b_2[maxn],a_3[maxn],b_3[maxn],ans[maxn];

void init()

void fft(cd *a,int n,int dft)

int main()

BZOJ4259 殘缺的字串

給出兩個字串,乙個模式串,乙個匹配串,問匹配串中哪些位置可以匹配上模式串,其中 可以作任意字元。這個可以轉化為多項式,我們可以把 看作0,其他字母看作各個數字,然後發現如果兩個字串相同,當且僅當 i 0n 1 a i b i 2 a i b i 0 sum 0 i 0n 1 a i b i 2 a ...

BZOJ4259 殘缺的字串

其實大部分字串的題都可以用多項式來想,包括這道題。於是,我們可以嘗試去構造兩個多項式,使其乘後的係數為0即可。相等為0,那麼我們可以用減法表示。可 可以匹配所有的符號,我們又該咋辦?那不就相當於乘個0嘛。於是,我們得到了下式 然後就可以卷積計算了。include include include in...

bzoj 4259 殘缺的字串

這題好神啊,居然是fft,表示一直在往資料結構上想。把 當成0,那麼兩個串可以匹配當且僅當 sum a i b i 2 times a i times b i 0 我們可以把平方拆開,然後就變成了幾個乘積相加的形式,那就大力翻轉乙個串然後跑fft。因為最開始mle了所以複製貼上了好多東西。1 inc...