題面傳送門:
思路:首先題目中不要連續的回文串,那麼答案就是總的回文串-連續回文串
連續回文串用manacher就可以o(n)搞出來
現在的問題是求總的回文串。
既然是回文串,我們就想到列舉對稱軸
為了方便表示在字元的夾縫的對稱軸,下標*2,下標為奇數則為夾縫。
令f[i]為對稱軸為i時兩邊相同的字元對數,那麼答案就是sigma (2^f[i])-1
現在的問題是快速求f[i]
令a[i]表示原串第i個為是否為a,b[i]表示原串第i個為是否為b;
那麼f[i]=sigma a[j]*a[k]+sigma b[x]+b[y] (j+k=i,x+y=i,j<=k,x<=y)
這不就是卷積嗎
上fft搞一搞就可以了
被遞迴版**常數嚇傻,卡著時限a...
#include#include#include#include#include#includeconst int maxn=270010,mod=1000000007;const double pi=m_pi;
using namespace std;
struct plextmp[maxn];
plex operator +(plex a,plex b);}
plex operator -(plex a,plex b);}
plex operator *(plex a,plex b);}
struct dft,t=(plex);
int p=bg,p0=bg,p1=bg+step;
for (int i=0;imx) mx=f[i]+i,id=i;
res+=f[i]>>1,res%=mod;
}return res;}
int main()
//int t=(int)clock();
printf("%d\n",(ans-manacher()+mod)%mod);//
//printf("%d\n",(int)clock()-t);
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...