bzoj3160 萬徑人蹤滅

2022-05-30 20:00:15 字數 1068 閱讀 9815

考慮先忽略不可以連成一段的條件。

那麼,暴力的做法就是,列舉乙個中心點,暴力找出旁邊有多少個對稱的點,設數量為\(x\),則這個中心點對答案的貢獻為\(2^x-1\)。

這樣是\(o(n^2)\)的,考慮怎麼優化。

對於中心點\(mid\),能對\(x\)造成貢獻的位置\(i,j\),一定是滿足\(i+j=mid*2\)且\(s[i]=s[j]\)。

寫出來就是:

\[ans=\sum_^[s_i=s_]

\]然後可以發現這其實是乙個卷積的形式,那麼弄兩個多項式\(a,b\)出來,\(a_i=[s[i]=a]\),\(b_i=[s[i]=b]\)。

然後分別自乘,\(mid\)處的答案就是:

\[2^+b_}-1

\]然後細節注意下就好了。

然後考慮怎麼處理連成一段的,這部分要減去。

這個實質上就是原串回文串的個數,跑一邊\(manacher\)就好了。

#includeusing namespace std;

void read(int &x)

void print(int x)

void write(int x)

const int maxn = 1e6+10;

const int mod = 998244353;

const int mod = 1e9+7;

char c[maxn],s[maxn];

int n,a[maxn],b[maxn],f[maxn];

int n,bit,pos[maxn];

int qpow(int a,int x,int p)

void ntt(int *r,int op)

return res;

}int main()

a[i]>>=1,b[i]>>=1;

ans=(ans+qpow(2,a[i]+b[i],mod)-1)%mod;

} ans=(ans-manacher()+mod)%mod;

write((ans+mod)%mod);

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 萬徑人蹤滅

題目在上方鏈結 description input output sample input sample output hint source 2013湖北互測week1 首先將字串中間插入 把他們分隔開 題目要求求不連續的回文串的個數 那麼就用總數減去連續的即可 考慮連續的部分 直接用manach...