考慮先忽略不可以連成一段的條件。
那麼,暴力的做法就是,列舉乙個中心點,暴力找出旁邊有多少個對稱的點,設數量為\(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...