BZOJ3160 萬徑人蹤滅

2022-06-27 22:09:19 字數 1333 閱讀 4530

題目大意

給乙個全都是a和b的序列,求以某點為中心的對稱的子串行的總數量(子串行不能完全連續),長度在fft範圍內

solution

首先我們答案就是總共的對稱子串行數量減去回文串的個數

回文串個數用馬拉車或者pam都可以解決

考慮怎麼解決總共的對稱子串行數量

我們發現,如果可以求出以某個點(可能是夾縫)為中心的對稱的點對的數量,我們就可以求出滿足某點為中心的對稱子串行的數量,這個數量是\(2^ -1\),-1意思是不能都不取

然後這個過程可以多項式乘法模擬

我們將原序列對應成兩個多項式a和b,a中的每一項滿足:若序列這一位為a,那麼這一項就是1,否則為0

b則為a取逆

a、b各自平方,我們發現它們就是以某點為中心,且字元為a或b的對稱的組數(此時若次數為奇數,那麼就是夾縫為中心,否則就是以某字元為中心)

所以把a、b係數加起來,像上面一樣統計答案,就愉快地解決了這麼個入門題

code:

#includeusing namespace std;

struct comp

}a[3000010],b[3000010];

comp operator +(comp a,comp b)

comp operator -(comp a,comp b)

comp operator *(comp a,comp b)

int rev[3000010];

int lim=1;

const double pi=acos(-1);

void fft(comp *a,int type) }}

int num[3000010];

int ans=0;

int poww[3000010];

int main()

for(int i=0;i<=lim;++i)

as[0]=2;

for(int i=1;i<=len;++i)

len<<=1;

manacher();

for(int i=1;i<=len;++i)

for(int i=0;ifft(a,1);

fft(b,1);

for(int i=0;ifft(a,-1);

for(int i=0;ifor(int i=0;ifor(int i=0;ifft(a,1);

fft(b,1);

for(int i=0;ifft(a,-1);

for(int i=0;ipoww[0]=1;

for(int i=1;ifor(int i=0;iprintf("%d\n",ans);

}

BZOJ3160 萬徑人蹤滅

對於每個可以作為對稱軸的位置,我們算出以其為對稱軸有多少對位置和字元是對稱的,設為t i 若不考慮不能連續,則我們可以從這t i 對里任選出來任意對,都是可行的答案,且不重不漏,所以不考慮不能連續的情況的答案為sigma 2 t i 1,考慮不能是連續子串,再減去回文子串的數量即可 回文子串數量ma...

BZOJ 3160 萬徑人蹤滅

給定乙個由 a 和 b 構成的字串,求不連續回文子串行的個數。正難則反我們考慮容斥。對於連續的回文字串顯然是一次馬拉車就可以很好的求出來的,那我們設f i 表示以i為中心的對稱字元對數量,顯然答案就是 2 n 1 12f i 1 那麼我們的問題就轉變成了怎麼求出f i 我們考慮當這個字元為a的時候做...

bzoj3160 萬徑人蹤滅

題目在上方鏈結 description input output sample input sample output hint source 2013湖北互測week1 首先將字串中間插入 把他們分隔開 題目要求求不連續的回文串的個數 那麼就用總數減去連續的即可 考慮連續的部分 直接用manach...