BZOJ1396 識別子串 字尾自動機 線段樹

2022-08-14 02:00:14 字數 1359 閱讀 2027

time limit: 10 sec  memory limit: 162 mb

submit: 451  solved: 290

[submit][status][discuss]

一行,乙個由小寫字母組成的字串s,長度不超過10^5

l行,每行乙個整數,第i行的資料表示關於s的第i個元素的最短識別子串有多長.

agoodcookcooksgoodfood12

3322

3322

3321

2332

1234

首先我們發現要找子串,想到用字尾自動機。

顯然只出現一次的子串為right=1的節點(即結束節點只有乙個)。對於這些節點,我們考慮對答案的貢獻。

對於乙個節點顯然endpos-maxlen+1到endpos-minlen+1的子串是唯一的貢獻為endpos-i+1。

對於endpos-minlen+1到endpos的節點,子串不唯一,我們需要將他向前延伸到endpos-minlen+1的點,貢獻為minlen。

維護兩棵線段樹即可。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define maxn 800005

8using

namespace

std;

9struct

data

13void extend(int c,int

x) 29}30

}31void

pre() 40}

41struct

tmp44

void pushup(int

o) 48

void pushdown(int

o) 54

void update(int l,int r,int o,int l,int r,int

val)

57int mid=l+r>>1,ls=o<<1,rs=ls+1;58

if(l<=mid)update(l,mid,ls,l,r,val);

59if(r>mid) update(mid+1

,r,rs,l,r,val);

60pushup(o);61}

62int query(int l,int r,int o,int

x) 69

}t1,t2;

70void work(int

x) 77

for(int i=1;i<=x;i++) 81}

82}sam;

83char

ch[maxn];

84int

main()

view code

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...