題目背景
題目描述
輸入輸出格式
輸入格式:
一行,乙個只包含a,b兩種字元的字串
輸出格式:
一行,乙個整數表示問題的答案
輸入輸出樣例
輸入樣例#1:
abaabaa
輸出樣例#1:
14 輸入樣例#2:
aaabbbaaa
輸出樣例#2:
44 輸入樣例#3:
aaaaaaaa
輸出樣例#3:
53 說明
分析:
可以考慮把總的對稱的方案數減去連成一塊的方案數。
顯然後面乙個就是回文串個數,直接回文樹解決。
假設我們的對稱中心是
k k
,那麼每個滿足的方案數2x
−1' role="presentation" style="position: relative;">2x−
12x−
1,其中
x x
為左右兩邊配對的對數,每對可以選或不選,減一表示不能為空。
然後我發現這個和gdkoi那道基站是乙個道理,不知道就跳過…… 那麼k
' role="presentation" style="position: relative;">k
k的答案為 ∑i
+j=2
k[s[
i]==s
[j]]
∑ i+
j=2k
[s[i
]==s[
j]]因為只有兩種字元,考慮每一種字元,設f[
k]f [k
]為aa
對數對k' role="presentation" style="position: relative;">k
k的方案, 則 f
[k]=
∑i+j
=2∗k
[s[i
]==a]
and[
s[j]
==a] f[k
]=∑i
+j=2
∗k[s
[i]==
a]an
d[s[
j]==a
]假設x[
i]=(
a[i]
==a) x[i
]=(a
[i]==
a)那麼 f[k
]=∑i
+j=2
∗kx[
i]∗x
[j] f[k
]=∑i
+j=2
∗kx[
i]∗x
[j]這個就是乙個卷積形式,直接fft。
發現每個對會算兩次,而在中心的字元只會算一次,判斷解決即可。
**:
// luogu-judger-enable-o2
#include
#include
#include
#include
#define ll long long
const
int maxn=3e5+7;
const
double pi=acos(-1);
const ll mod=1e9+7;
using
namespace
std;
ll n,cnt,len;
ll r[maxn];
char s[maxn];
ll f[maxn],g[maxn],ans;
struct nodet[maxn];
struct recw[maxn],a[maxn],b[maxn],c[maxn];
rec operator +(rec a,rec b);}
rec operator -(rec a,rec b);}
rec operator *(rec a,rec b);}
rec operator !(rec a);}
void build_tree()
now=t[now].son[s[i]-'a'];
ans=(ans+t[now].sum)%mod;
}}void fft(rec *a,ll f)
; for (ll i=2;i<=len;i*=2)
;for (ll j=i/2;j>=0;j-=2) w[j]=w[j/2];
for (ll j=1;j2;j+=2) w[j]=w[j-1]*wn;
for (ll j=0;jfor (ll k=0;k2;k++)}}
}void init(ll len)
}void fft(ll *x,ll *y,ll *z,ll n,ll m)
; b[i]=(rec);
}fft(a,1); fft(b,1);
for (int i=0;i1);
for (int i=0;i0.5);
}ll power(ll x,ll y)
int main()
build_tree();
fft(f,f,f,n,n);
fft(g,g,g,n,n);
ans=mod-ans;
for (ll i=0;i<=2*(n-1);i++)
f[i]/=2;
g[i]/=2;
ans=(ans+power(2,f[i]+g[i])+mod-1)%mod;
}printf("%lld",ans);
}
P4199 萬徑人蹤滅 FFT
給出乙個只包含 a,b 的字串 求有多少個不連續的回文子串行 字母回文,位置對稱 1 leq n leq 10 5 這個不連續一看就很nt,考慮求出所有的再減去連續的 對於每個對稱軸來說,a,b 分開考慮貢獻再乘起來再減去一 兩個都為空 加入計算 a 的貢獻,就是看有多少對 a 以它為對稱軸,設為 ...
luogu4199 萬徑人蹤滅
答案等於 關於某條對稱軸對稱的所有合法子串行的答案 連續的合法子串行的答案。後面那個就是該串中回文串的數目,直接manacher搞定。至於前面的那個,首先考慮在某條軸的兩側有 k 對字串呈軸對稱相同。那麼關於這條軸對稱的答案就是 2 k 1 注意到關於同一條軸對稱的兩對字元必然滿足每對字元的下標和相...
萬徑人蹤滅(FFT manacher)
傳送門 這題 我覺得像我這樣的菜雞選手難以想出來 題目要求求出一些子串行,使得其關於某個位置是對稱的,而且不能是連續一段,求這樣的子串行的個數。這個直接求很困難,但是我們可以先求出所有關於某個位置對稱的子串行,最後減去子串的個數。子串個數可以用 manacher 求,至於子串行的話,我們假設以第 i...