P4199 萬徑人蹤滅 FFT

2022-08-02 07:42:10 字數 986 閱讀 1888

給出乙個只包含\(a,b\)的字串

求有多少個不連續的回文子串行(字母回文,位置對稱)

\(1\leq n\leq 10^5\)

這個不連續一看就很nt,考慮求出所有的再減去連續的

對於每個對稱軸來說,\(a,b\)分開考慮貢獻再乘起來再減去一(兩個都為空)。

加入計算\(a\)的貢獻,就是看有多少對\(a\)以它為對稱軸,設為\(k\)對,那麼方案就是\(2^k\)。

怎麼對於每個對稱軸快速計算有多少對?也就是每對\(a\)都會對他們的對稱軸產生貢獻,假設\(i\)於\(j\)都是\(a\),那麼對稱軸就是\(\frac\),這個直接\(fft\)就可以了

然後\(b\)同理。

然後字串hash+二分計算連續的方案就好了

時間複雜度\(o(n\log n)\)

#include#include#include#define ll long long

#define ull unsigned long long

using namespace std;

const ll n=4e5+10,p=998244353,p=1e9+7;

const ull g=131;

ll n,l,a[n],b[n],r[n],ans;

ull pw[n],h[n],d[n];

char s[n];

ll power(ll x,ll b,ll p)

return ans;

}void ntt(ll *f,ll op)

ans-=r+1;

} for(ll i=1;i>1;

if(geth(i-mid+1,i+mid)==getd(i-mid+1,i+mid))l=mid+1;

else r=mid-1;

} ans-=r;

} printf("%lld\n",(ans%p+p)%p);

return 0;

}

洛谷 P4199 萬徑人蹤滅 回文樹 fft

題目背景 題目描述 輸入輸出格式 輸入格式 一行,乙個只包含a,b兩種字元的字串 輸出格式 一行,乙個整數表示問題的答案 輸入輸出樣例 輸入樣例 1 abaabaa 輸出樣例 1 14 輸入樣例 2 aaabbbaaa 輸出樣例 2 44 輸入樣例 3 aaaaaaaa 輸出樣例 3 53 說明 分...

luogu4199 萬徑人蹤滅

答案等於 關於某條對稱軸對稱的所有合法子串行的答案 連續的合法子串行的答案。後面那個就是該串中回文串的數目,直接manacher搞定。至於前面的那個,首先考慮在某條軸的兩側有 k 對字串呈軸對稱相同。那麼關於這條軸對稱的答案就是 2 k 1 注意到關於同一條軸對稱的兩對字元必然滿足每對字元的下標和相...

bzoj 3160 萬徑人蹤滅 FFT

題目 求出關於乙個位置有多少對對稱字母,如果 i 位置有 f i 對,對答案的貢獻是 2 f i 1 然後減去連續的,用 manachar 求出回文長度,每個位置作為邊界都是一種不合法情況 求對稱,首先把字串中間穿插字元 於是字串的長度變成2倍 考慮一對字母 s x s y 如果 s x s y 其...