BZOJ3160 萬徑人蹤滅

2022-04-28 22:30:30 字數 1277 閱讀 1085

bzoj

luogu

就是要在乙個只含\(a,b\)的字串中選取乙個子串行,使得:

1、位置和字元都關於某條對稱軸對稱。

2、不能是連續的一段。

求方案數模\(10^9+7,n\le10^5\)

其實就是對於任意乙個對稱中心,你算出關於它對稱的有多少位置,假設是\(f_i\)那麼乙個對稱中心的貢獻就是\(2^-1\)(從中選取乙個非空子集即可)。

但是這可能是連續的呀!

你想想連續的會是什麼。回文串?

那麼連續的個數其實就是字串中回文串的個數!

到這裡思路就比較清晰了,我們只需要求出「對於任意乙個對稱中心,有多少位置關於它對稱」。

想一想兩個字元關於某乙個位置對稱的形式化表示?

\(s[i]==s[2x-i]\)

其中\(x\)就是對稱中心的位置,注意因為對稱中心可以使某個夾縫,所以\(x\)是可以取\(k+0.5(k\in z)\)的。

上面那個東西像什麼?會發現兩個下標之和\(i+(2x-i)=2x\)是乙個常數,卷積?

對於每種字元\(ch\),設多項式\(f(x)\)其中\(f(i)=[s[i]==ch]\),我們只要對這個多項式卷積一下就可以求出每個位置有多少對滿足對稱關係的字元了。

因為在卷積中每對不同位置的對稱字元被計算了兩次,而相同位置的對稱字元(自己和自己關於自身對稱)只計算了一次,所以要把答案除2向上取整。

#include#include#include#includeusing namespace std;

const double pi = acos(-1);

const int mod = 1e9+7;

const int n = 4e5+5;

struct complex

complex(double a,double b)

complex operator + (complex b)

complex operator - (complex b)

complex operator * (complex b)

}w[n],a[n];

int n,m,l,rev[n],tw[n],f[n],p[n],mx,id,ans;

char s[n];

void fft(complex *p,int opt)

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

ans=(ans-p[i]/2+mod)%mod;

printf("%d\n",ans);return 0;

}

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