BZOJ3160 萬徑人蹤滅

2021-07-14 07:32:47 字數 1514 閱讀 6008

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

回文子串數量manacher求就可以了

考慮一下,如果兩個位置和字元a[i]和a[j]關於第x個位置對稱,那麼就是i+j==2*x並且a[i]==a[j],如果a[i]和a[j]關於x與x+1中間的夾縫對稱,那麼就有i+j==2*x+1並且a[i]==a[j](其實隨便yy一下就會覺得這是乙個卷積,把串複製一遍放上邊,對稱的兩個點上下之間連線,然後就能直接看出來是卷積)

明顯是乙個卷積的形式,由於只有a和b兩種字元,對於a和b分開來計算,先讓所有為a的位置為1,其餘為0算一遍卷積,再讓所有為b的位置為1,算一遍卷積,兩遍卷積的結果加起來就得到了t陣列,然後就能算答案了

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 400010

#define maxm 1010

#define mod 1000000007

#define inf 1000000000

#define eps 1e-8

#define ll long long

const double pi=acos(-1);

struct cl

cl(double _x,double _y)

friend cl operator +(cl x,cl y)

friend cl operator -(cl x,cl y)

friend cl operator *(cl x,cl y)

friend cl operator /(cl x,double y)

};int n;

char s[maxn];

int a[maxn];

int f[maxn],now,mx;

int ans;

cl b[maxn];

int l,r[maxn];

ll t[maxn];

void fft(cl *a,int f)

return re;

}int main()else

} s[0]='$';

s[1]='*';

int n=n<<1|1;

for(i=1;i<=n;i++)else

for(;s[i-f[i]-1]==s[i+f[i]+1];f[i]++)

if(i+f[i]>mx)

} for(i=1;i<=n;i++)

n=n<<1;

for(n=1;n<=n;n<<=1)

for(i=0;i>1]>>1|((i&1)<<(l-1));

} for(i=0;i

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...

BZOJ3160 萬徑人蹤滅

bzoj luogu 就是要在乙個只含 a,b 的字串中選取乙個子串行,使得 1 位置和字元都關於某條對稱軸對稱。2 不能是連續的一段。求方案數模 10 9 7,n le10 5 其實就是對於任意乙個對稱中心,你算出關於它對稱的有多少位置,假設是 f i 那麼乙個對稱中心的貢獻就是 2 1 從中選取...