BZOJ4259 殘缺的字串(FFT 卡常)

2021-08-16 10:22:22 字數 1074 閱讀 6115

題面

題意:兩個串a和b,有萬用字元,問a在b中出現了幾次。

好題(除了卡常以外)

將萬用字元設為0

列舉開頭x 設f

[x]=

∑m−1

i=0a

[i]∗

b[x+

i]∗(

a[i]

−b[x

+i])

2 f[x

]=∑i

=0m−

1a[i

]∗b[

x+i]

∗(a[

i]−b

[x+i

])

2若f[x]為0,則a在b[x]處出現了一次

f又恰好為乙個卷積的形式

fft優化即可(好像爆int,用不了ntt)

卡卡常就過了

為什麼單位根累乘會比預處理快很多

#include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mmst(a, b) memset(a, b, sizeof(a))

#define mmcp(a, b) memcpy(a, b, sizeof(b))

typedef

long

long ll;

const

int p=(479

<<21)+1,n=1444444;

const

double pi=acos(-1);

struct yy

};yy operator +(yy a,yy b)

yy operator -(yy a,yy b)

yy operator *(yy a,yy b)

int n,rev[n];

void init(int lim)

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...