bzoj3160 萬徑人蹤滅

2021-08-18 19:29:38 字數 2246 閱讀 7962

題目在上方鏈結

description

input

output

sample input

sample output

hint

source

2013湖北互測week1

首先將字串中間插入」#」 把他們分隔開

題目要求求不連續的回文串的個數 那麼就用總數減去連續的即可 考慮連續的部分 直接用manacher求即可 算出長度 然後再/2就是答案

不連續的怎麼辦 考慮現在用#將他們隔開 然後假如只考慮字元是a的貢獻

那麼 顯然字元a都會出現在偶數字置上 那麼想辦法知道乙個位置左右對稱的符合要求的字元即可得到答案 比如#a#b#a這樣關於b左右對稱的就是2 然後答案就是2^2-1

那麼想辦法計算出左右對稱位置符合要求的這個t即可

設當前在第k位f[

k]=∑

i不越界

[k−i

mod2=0

][sk

−i=′

a′][

sk+i

=′a′

] f[k

]=∑i

不越界[

k−

imod2=

0][s

k−i=

′a′]

[sk+

i=′a

′]

∑t∑i不越界

[k−i

=2×t

][sk

−i2=

′a′]

[sk+

i2=′

a′] ∑t∑

i不越界

[k−i

=2×t

][sk

−i2=

′a′]

[sk+

i2=′

a′

]∑t∑

i不越界

[k−i

=2×t

]st∗

sk−t

∑ t∑

i不越界

[k−i

=2×t

]st∗

sk−t

∑t[k−2∗

t>=0]

st∗s

k−t ∑t[

k−2∗

t>=0]

st∗s

k−

t∑t=

0⌊k2

⌋st∗

sk−t

∑ t=

0⌊k2

⌋st∗

sk−t

s即表示該串這個位置是否為a|b為的話就是1

然後兩次dft一次idft即可

#include

#include

#include

#include

#define pi acos(-1)

#define ll long long

using

namespace

std;

const

int mod=1000000007;

const

int n=100020;

struct c;}

inline

friend c operator -(const c &x,const c &y);}

inline

friend c operator *(const c &x,const c &y);}

inline

void

operator *=(const c &y)

}a[n<<2],b[n<<2];

int n,m,r[n<<2],p[n<<1];ll ans;

inline

void fft(c *x,int f);

for (int j=0;j1),t1,t2;

for (int k=0;kif (f==-1) for (int i=0;iinline

int ksm(ll b,int t)char s[n],s1[n<<1];

template

inline

void add(t &x,int v)

template

inline

void dec(t &x,int v)

int main()

// for (int i=1;i<=m;++i) printf("%d ",p[i]);

printf("%lld\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 萬徑人蹤滅

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