BZOJ 1396 識別子串

2021-07-11 19:45:51 字數 1103 閱讀 2225

solution:

我得了「能用字尾陣列就一定不用字尾自動機綜合症」….感覺用height、rank、sa 處理字串真的好優雅….

雖然其他題上字尾陣列常數比較大…不過這個字尾陣列水了一發似乎就rank1 了…開心

題解就是求出字尾陣列以後維護乙個單調佇列來更新答案啦。。。

#include 

#include

#include

#include

#define rep(i, x, y) for (int i = (x), _ = (y); i <= _; ++i)

#define down(i, x, y) for (int i = (x), _ = (y); i >= _; --i)

#define x first

#define y second

#define lx_judge

using

namespace

std;

typedef

long

long ll;

template

inline

void up_max(t & x, t y)

template

inline

void up_min(t & x, t y)

template

inline

void read(t & x)

const

int inf = 0x3f3f3f3f ;

const

int n = 1e5 + 10;

namespace suffix_array

for (i = 0; i < n; ++i)

rank[sa[i]] = i;

for (p = 0, i = 0; i < n - 1; ++i)

height[n] = height[0] = height[1] = 0;

}}namespace my_worker

int query(int x)

}char str[n];

int main()

return

0;}

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

bzoj1396 識別子串

solution 只出現一次的點只能是葉子。假設某乙個葉子表示的區間是 1 max 它的父親的長度是m。也就是 max m,max 只出現過一次。那麼我們可以用這m 1長來更新 max m,max a 剩下 1,max m 的位置x,可以用 x,max 這段區間的長度來更新。b 於是按下標開兩棵線段...