bzoj 4259 殘缺的字串

2022-04-30 08:42:06 字數 1701 閱讀 3211

這題好神啊,居然是fft,表示一直在往資料結構上想。

把'*'當成0,那麼兩個串可以匹配當且僅當$$\sum (a[i]-b[i])^2\times a[i]\times b[i]==0$$

我們可以把平方拆開,然後就變成了幾個乘積相加的形式,那就大力翻轉乙個串然後跑fft。

因為最開始mle了所以複製貼上了好多東西。

1 #include2 #include3 #include4 #include5 #include6

#define n 1200005

7#define m 300005

8#define pi acos(-1)

9#define e complex

10using

namespace

std;

11struct

complex

1215

complex()

16 friend complex operator * (const complex &a,const complex &b)

1720 friend complex operator / (complex a,double

b)21

24 friend complex operator +(complex a,complex b)

2528 friend complex operator -(complex a,complex b)

2932

};33

int r[n];int

n;34

void fft(e *a,int

f)3548}

49}50if(f==-1)for(int i=0;in;51}

52int

nn,mm;

53char

s1[m],s2[m],s3[m];

54e a1[n],b1[n],c1[n];

55int

ans[n];

56int

st[m],top;

57int

main()

5871

for(int i=0;i)

7277 fft(a1,1);fft(b1,1

);78

for(int i=0;ib1[i];

79for(int i=0;i0;80

81for(int i=0;i)

8287

for(int i=0;i)

8893 fft(a1,1);fft(b1,1

);94

for(int i=0;ib1[i]);

95for(int i=0;i0;96

97for(int i=0;i)

98103

for(int i=0;i)

104109 fft(a1,1);fft(b1,1

);110

for(int i=0;ib1[i]);

111112 fft(c1,-1

);113

114for(int i=nn-1;i)

115120

}121 printf("

%d\n

",top);

122for(int i=1;i<=top;i++)

123127

return0;

128 }

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

Bzoj4259 殘缺的字串

time limit 10 sec memory limit 128 mb submit 387 solved 93 很久很久以前,在你剛剛學習字串匹配的時候,有兩個僅包含小寫字母的字串a和b,其中a串長度為m,b串長度為n。可當你現在再次碰到這兩個串時,這兩個串已經老化了,每個串都有不同程度的殘缺...