由於正向求是否有斷開的不好求左右匹配數,那麼我們換乙個角度:回文串總數-連續情況
顯然,連續情況manacher一下就是\(\sum_^ p_i\),其中\(2n\)是因為還有偶長度的回文串,需要新增特殊字元。
然後求總數就是\(\sum(2^-1)\)。
其中\(f_i\)為以i位置為對稱軸匹配字元的個數。-1是空集情況。
這個可以直接fft求,a,b分開計算,計算a的時候將ch[i]==a的位置賦為1,然後fft就可以得出f。
#include#include#include#include#include#includeusing namespace std;
#define ll long long
#define pi 3.1415926535
const ll mod = 1e9+7;
inline ll read()
const ll maxn = 4e5+5;
const ll inf = 2147483600;
char str2[maxn+1],str[maxn+1]; ll n;
ll len[maxn+1],f[maxn+1];
ll lim=1,l,r[maxn+1];
struct cpx
}a[maxn+1],b[maxn+1];
cpx operator + (cpx a,cpx b)
cpx operator - (cpx a,cpx b)
cpx operator * (cpx a,cpx b)
ll m; ll rev[maxn+1];
inline void fft(cpx *a,ll type)
for(ll i=1;i<=2*n;i++) ans=(ans-len[i]/2+mod)%mod;
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 萬徑人蹤滅
題目在上方鏈結 description input output sample input sample output hint source 2013湖北互測week1 首先將字串中間插入 把他們分隔開 題目要求求不連續的回文串的個數 那麼就用總數減去連續的即可 考慮連續的部分 直接用manach...