這題好神啊,居然是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。可當你現在再次碰到這兩個串時,這兩個串已經老化了,每個串都有不同程度的殘缺...