給定乙個由』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 從中選取...