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

2021-08-23 14:13:30 字數 3080 閱讀 5243

題目背景

題目描述

輸入輸出格式

輸入格式:

一行,乙個只包含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...