time limit: 10 sec memory limit: 128 mb
submit: 387 solved: 93
很久很久以前,在你剛剛學習字串匹配的時候,有兩個僅包含小寫字母的字串a和b,其中a串長度為m,b串長度為n。可當你現在再次碰到這兩個串時,這兩個串已經老化了,每個串都有不同程度的殘缺。
你想對這兩個串重新進行匹配,其中a為模板串,那麼現在問題來了,請回答,對於b的每乙個位置i,從這個位置開始連續m個字元形成的子串是否可能與a串完全匹配?
第一行包含兩個正整數m,n(1<=m<=n<=300000),分別表示a串和b串的長度。
第二行為乙個長度為m的字串a。
第三行為乙個長度為n的字串b。
兩個串均僅由小寫字母和*號組成,其中*號表示相應位置已經殘缺。
第一行包含乙個整數k,表示b串中可以完全匹配a串的位置個數。
若k>0,則第二行輸出k個正整數,從小到大依次輸出每個可以匹配的開頭位置(下標從1開始)。
3 7a*b
aebr*ob
21 5
by claris
數學問題 fft 字串 腦洞題
題解看這裡→
這道題只不過給兩個串都加了萬用字元而已。只要在之前那道題的式子上再乘乙個a[i]就可以了。
跑得巨慢,嘗試優化各種地方,在submission status上留下了一串紅。
最後發現我的fft板子之前是用來處理等長卷積的,所以長度直接設成len*2,實際上只用len(a)+len(b)就可以了(第43行)
速度快了一倍,4768ms成功rank7
↑在此之前手寫複數類從1w+優化9000ms
1/*by silvern
*/2 #include3 #include4 #include5 #include6 #include7 #include8
using
namespace
std;
9const
double pi=acos(-1.0
);10
const
int mxn=1150011;11
struct
com;}
14 com operator - (const com y);}
15 com operator * (const com y);}
16}c[mxn],d[mxn],e[mxn];
17double
a[mxn],b[mxn];
18int
n,l;
19int
rev[mxn];
20void fft(com *a,int
flag)
23for(i=1;i1
);25
for(j=0;j1
));27
for(k=0;kwn)32}
33}34if(flag==-1)for(i=0;in;35}
36char s1[300021],s2[300021
];37
int ans[mxn],cnt=0;38
intmain()
46for(i=0;i)
50for(i=0;i)
54for(i=0;i)
57for(i=0;i)
60 fft(c,1);fft(d,1
);61
for(i=0;i//
a^3*b
62//
63//
memset(c,0,sizeof c);
64//
memset(d,0,sizeof d);
65for(i=0;i0
;}66
for(i=0;i0
;}67 fft(c,1);fft(d,1
);68 com tmp=(com);
69for(i=0;i//
2ab*a*b
70//
71//
memset(c,0,sizeof c);
72//
memset(d,0,sizeof d);
73for(i=0;i0
;}74
for(i=0;i0
;}75 fft(c,1);fft(d,1
);76
for(i=0;i//
b^3*a
77//
78 fft(e,-1
);79
for(i=l2-1;i)
80if(abs(e[i].a)<=0.5
)83 printf("
%d\n
",cnt);
84for(i=1;i<=cnt;i++)
87return0;
88 }
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...