答案等於:關於某條對稱軸對稱的所有合法子串行的答案-連續的合法子串行的答案。
後面那個就是該串中回文串的數目,直接manacher搞定。
至於前面的那個,首先考慮在某條軸的兩側有\(k\)對字串呈軸對稱相同。那麼關於這條軸對稱的答案就是\(2^k-1\).
注意到關於同一條軸對稱的兩對字元必然滿足每對字元的下標和相等。那麼我們可以將每根軸的編號看成是關於這根軸對稱的每兩個字元的下標和,定義\(f_i=\sum_^i[s_i=s_]\),那麼\(k=\lceil\frac\rceil\)。
我們再定義兩個輔助函式:\(g_i=[s_i=a],h_i=[s_i=b]\),那麼顯然就會有\(f=g*g+h*h\)。做兩遍多項式乘法即可。
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef long double db;
typedef pairpii;
const int n=100000+100;
const db pi=acos(-1.0);
#define lowbit(x) (x)&(-x)
#define sqr(x) (x)*(x)
#define rep(i,a,b) for (register int i=a;i<=b;i++)
#define per(i,a,b) for (register int i=a;i>=b;i--)
#define go(u,i) for (register int i=head[u];i;i=sq[i].nxt)
#define fir first
#define sec second
#define mp make_pair
#define pb push_back
#define maxd 1000000007
#define eps 1e-8
inline int read()
while ((ch>='0') && (ch<='9'))
return x*f;
}namespace my_math
int dec(int x,int y)
return ans;
} int inv(int x)
int c(int n,int m)
void fft(int lim,complex *a,int typ) }
return ans;
}int main()
//cout << ans << endl;
ans=dec(ans,manacher(s));
printf("%lld\n",ans);
return 0;
}
P4199 萬徑人蹤滅 FFT
給出乙個只包含 a,b 的字串 求有多少個不連續的回文子串行 字母回文,位置對稱 1 leq n leq 10 5 這個不連續一看就很nt,考慮求出所有的再減去連續的 對於每個對稱軸來說,a,b 分開考慮貢獻再乘起來再減去一 兩個都為空 加入計算 a 的貢獻,就是看有多少對 a 以它為對稱軸,設為 ...
萬徑人蹤滅(FFT manacher)
傳送門 這題 我覺得像我這樣的菜雞選手難以想出來 題目要求求出一些子串行,使得其關於某個位置是對稱的,而且不能是連續一段,求這樣的子串行的個數。這個直接求很困難,但是我們可以先求出所有關於某個位置對稱的子串行,最後減去子串的個數。子串個數可以用 manacher 求,至於子串行的話,我們假設以第 i...
洛谷 P4199 萬徑人蹤滅 回文樹 fft
題目背景 題目描述 輸入輸出格式 輸入格式 一行,乙個只包含a,b兩種字元的字串 輸出格式 一行,乙個整數表示問題的答案 輸入輸出樣例 輸入樣例 1 abaabaa 輸出樣例 1 14 輸入樣例 2 aaabbbaaa 輸出樣例 2 44 輸入樣例 3 aaaaaaaa 輸出樣例 3 53 說明 分...