BZOJ1396 識別子串

2022-05-03 18:03:10 字數 1173 閱讀 1209

time limit: 10 sec  memory limit: 162 mb

submit: 240  solved: 148

[submit][status][discuss]

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

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

agoodcookcooksgoodfood12

3322

3322

3321

2332

1234

據說因為sam是一棵逆序的字尾樹,那麼每一位i的字首(除了包含在別的字首裡面)所對應的節點一定是字尾樹里的葉子節點。那麼我們只要找到它的父親節點,然後它的父親節點對應的子串填上一位字元就是乙個識別子串。具體膜拜這個部落格:我還是太弱了。

1 #include2 #include3 #include4

#define inf 1<<30

5#define maxn 100005

6using

namespace

std;

7intn;8

char

s[maxn];

9struct

sam13

int newnode(int x)

14void extend(int

x)27

}28 last=np;29}

30}sam;

31structt34

void add(int z,int l,int r,int x,int y,int

w)37

int mid=(l+r)>>1

;38 add(z*2,l,mid,x,y,w); add(z*2+1,mid+1

,r,x,y,w);39}

40int query(int z,int l,int r,int

x)46

}f,t;

47int

main()

57for(int i=1;i<=n;i++) printf("

%d\n

",min(f.query(1,1,n,i),t.query(1,1,n,i)-i+1

));58

return0;

59 }

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