BZOJ 3160 萬徑人蹤滅

2022-06-02 18:57:10 字數 1884 閱讀 6046

time limit: 10 sec  memory limit: 256 mb

submit: 2662  solved: 1447

[submit][status][discuss]

考慮用總回文序列數減去回文串數

對於每個對稱軸,只需要知道有多少對關於它對稱然後計算

先把$a$置為$1$,$b$置為$0$做一次卷積,然後$a$置為$0$,$b$置為$1$做一次卷積

兩次加起來再稍微處理一下就行了

回文串數用馬拉車求

#include using

namespace

std;

const

int maxn = 262144, mod = 1e9 + 7

;const

double pi = acos(-1.0

);struct

comp

friend comp

operator * (const comp &a, const comp &b)

friend comp

operator + (const comp &a, const comp &b)

friend comp

operator - (const comp &a, const comp &b)

}f[maxn], g[maxn];

intrev[maxn];

void dft(comp a, int len, int

kind)

}comp wn, s, t, tmp;

for(int i = 1; i < len; i <<= 1

) }

}if(kind == -1) for(int i = 0; i < len; i++) a[i].x /=len;

}void init(int &len, intn)}

int bin[100000 + 10

];char str[200000 + 10

];int slen, p[200000 + 10] = ;

intmain()

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

dft(f, len, 1);

dft(g, len, 1);

for(int i = 0; i < len; i++) g[i] = g[i] * g[i] + f[i] *f[i];

dft(g, len, -1

);

for(int i = 0; i < n; i++) g[i << 1].x++;

bin[

0] = 1

;

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

int ans = 0

;

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

for(int i = n - 1; ~i; i--)

str[

0] = '

~'; str[1] = '$'

; slen = 2 * n + 2

;

int mr = 0

, mid;

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

while(str[i + p[i]] == str[i - p[i]]) p[i]++;

if(p[i] + i > mr) mr = p[i] + i - 1, mid =i;

ans -= p[i] >> 1

;

if(ans < 0) ans +=mod;

}printf(

"%d\n

", ans);

return0;

}

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