time limit: 10 sec memory limit: 256 mb
submit: 2662 solved: 1447
[submit][status][discuss]
考慮用總回文序列數減去回文串數
對於每個對稱軸,只需要知道有多少對關於它對稱然後計算
先把$a$置為$1$,$b$置為$0$做一次卷積,然後$a$置為$0$,$b$置為$1$做一次卷積
兩次加起來再稍微處理一下就行了
回文串數用馬拉車求
#include usingnamespace
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...