題目大意
給乙個全都是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...