給出乙個只包含\(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 其...