bzoj1396 識別子串

2021-09-16 23:35:04 字數 1287 閱讀 1127

solution

只出現一次的點只能是葉子。

假設某乙個葉子表示的區間是[1-max]

它的父親的長度是m。 也就是[max-m,max]只出現過一次。

那麼我們可以用這m+1長來更新[max-m,max]。----a

剩下[1,max-m]的位置x,可以用[x,max]這段區間的長度來更新。---b

於是按下標開兩棵線段樹,一棵維護權值,實現a,一棵維護位置,實現b

然後就好啦

#include#include

#include

#include

#include

#include

#include

#define maxn 200005

using

namespace

std;

int n,cnt=1,rt=1,la=1,w[maxn],tr[maxn*20][2

],root[maxn],tot,ans;

intnum[maxn];

char

ch[maxn];

struct

nodes[maxn];

vector

g[maxn];

void ins(int c,int

id) }

} int

get(int v,int

w)void add(int &r,intv)}

int merge(int x,int

y)int query(int x,int y,int d,int

a)

if(tr[x][1]&&tr[y][0

])

if(v)return

v;

if(tr[x][0]&&tr[y][0

])

if(tr[x][1]&&tr[y][1

])

returnv;}

void dfs(int

k)

if(s[k].id!=0)add(root[k],w[s[k].id]),num[k]++;

if(num[k]>1)ans=max(ans,query(root[k],root[k],20,0)+s[k].max);

}int

main()

view code

posted @

2019-04-06 21:35

liankewei123456 閱讀(

...)

編輯收藏

BZOJ 1396 識別子串

solution 我得了 能用字尾陣列就一定不用字尾自動機綜合症 感覺用height rank sa 處理字串真的好優雅 雖然其他題上字尾陣列常數比較大 不過這個字尾陣列水了一發似乎就rank1 了 開心 題解就是求出字尾陣列以後維護乙個單調佇列來更新答案啦。include include incl...

Bzoj1396 識別子串

i 1,n i 1,n 求包含 i i 並且在原串 s role presentation style position relative s s中只出現一次的子串的最短長度 因為每個點pa rent p ar en t樹上的父親肯定是當前節點所代表的串的字尾 那麼只出現一次的串就是pa rent ...

BZOJ1396 識別子串

列舉左端點 i 那麼可行的右端點 j 的最小值單調不下降,可以通過雙指標求出,檢驗可以通過在字尾陣列裡檢查相鄰height值做到 o 1 那麼左端點為 i 右端點在 j,n 它對前面一段的貢獻為定值,對後面一段的貢獻為等差數列,線段樹維護即可。時間複雜度 o n log n include incl...