題目在上方鏈結
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 從中選取...