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 於是按下標開兩棵線段...