bzoj3160 萬徑人蹤滅

2022-08-26 14:42:23 字數 1167 閱讀 6566

題面傳送門:

思路:首先題目中不要連續的回文串,那麼答案就是總的回文串-連續回文串

連續回文串用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...