solution
只出現一次的點只能是葉子。
假設某乙個葉子表示的區間是[1-max]
它的父親的長度是m。 也就是[max-m,max]只出現過一次。
那麼我們可以用這m+1長來更新[max-m,max]。----a
剩下[1,max-m]的位置x,可以用[x,max]這段區間的長度來更新。---b
於是按下標開兩棵線段樹,一棵維護權值,實現a,一棵維護位置,實現b
然後就好啦
#include#includeview code#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()
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...