BZOJ 3160 萬徑人蹤滅

2021-08-10 10:36:24 字數 1391 閱讀 4601

給定乙個由』a』和』b』構成的字串,求不連續回文子串行的個數。

正難則反我們考慮容斥。對於連續的回文字串顯然是一次馬拉車就可以很好的求出來的,那我們設f[i]表示以i為中心的對稱字元對數量,顯然答案就是∑2

∗n+1

12f[

i]−1

那麼我們的問題就轉變成了怎麼求出f[i]

我們考慮當這個字元為a的時候做一遍fft,為b的時候再做一遍就好

#include 

#define pi acos(-1)

const

int inf = 1000000000;

const

int mod = 1e9 + 7;

const

int n = 400010;

using

namespace

std;

typedef

long

long ll;

typedef

complex

e;ll ans;

int n,m,l;

e a[n],b[n];

int rev[n];

ll f[n],bin[n];

char s[n],st[n];

int p[n];

void fft(e *a,int f) }}

}int manacher(char *r,int len)

int mx = 0, id, tot = 0;

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

return tot;

}int main()

fft(a, 1);

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

b[i] = a[i] * a[i];

memset(a,0,sizeof(a));

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

fft(a,1);

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

b[i] += a[i] * a[i];

fft(b,-1);

ll ans = 0;

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

f[i] += (ll)(b[i - 2].real() + 0.5) / n;

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

ans = (ans + bin[(f[i] + 1) >> 1] - 1) % mod;

printf("%lld",(ans + mod - manacher(s,len)) % mod);

return

0;}

BZOJ3160 萬徑人蹤滅

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

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 從中選取...