其實大部分字串的題都可以用多項式來想,包括這道題。
於是,我們可以嘗試去構造兩個多項式,使其乘後的係數為0即可。
相等為0,那麼我們可以用減法表示。
可『*』可以匹配所有的符號,我們又該咋辦?那不就相當於乘個0嘛。
於是,我們得到了下式:
然後就可以卷積計算了。
#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
#define int ll
#define gc() getchar()
templatevoid read(_t &x)
while(s>='0'&&s<='9')
x*=f;
}template_t fabs(_t x)
const int maxn=1200005;
const double pi=acos(-1.0);
const double eps=1e-9;
int rev[maxn];
struct complex
complex operator + (complex b)
complex operator - (complex b)
complex operator * (complex b)
complex operator * (double b)
complex operator / (double b)
}a[maxn],b[maxn];
void fft(int lim,complex *x,int typ)
printf("%d\n",ansi);
for(int i=1;i<=ansi;i++)printf("%d ",ans[i]);
return 0;
}
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 ...
bzoj 4259 殘缺的字串
這題好神啊,居然是fft,表示一直在往資料結構上想。把 當成0,那麼兩個串可以匹配當且僅當 sum a i b i 2 times a i times b i 0 我們可以把平方拆開,然後就變成了幾個乘積相加的形式,那就大力翻轉乙個串然後跑fft。因為最開始mle了所以複製貼上了好多東西。1 inc...
Bzoj4259 殘缺的字串
time limit 10 sec memory limit 128 mb submit 387 solved 93 很久很久以前,在你剛剛學習字串匹配的時候,有兩個僅包含小寫字母的字串a和b,其中a串長度為m,b串長度為n。可當你現在再次碰到這兩個串時,這兩個串已經老化了,每個串都有不同程度的殘缺...