BZOJ1396 識別子串

2021-09-08 17:58:03 字數 932 閱讀 6068

列舉左端點$i$,那麼可行的右端點$j$的最小值單調不下降,可以通過雙指標求出,檢驗可以通過在字尾陣列裡檢查相鄰height值做到$o(1)$。

那麼左端點為$i$,右端點在$[j,n]$,它對前面一段的貢獻為定值,對後面一段的貢獻為等差數列,線段樹維護即可。

時間複雜度$o(n\log n)$。

#include#includeconst int n=100010,m=262150;

int n,i,j,rk[n],sa[n],height[n],tmp[n],cnt[n],ta[m],tb[m];char s[n];

void suffixarray(int n,int m)

for(j=rk[height[i=k=0]=0];i=y-x+1||height[k+1]>=y-x+1;

}inline void up(int&a,int b)

void build(int x,int a,int b)

void tag(int*v,int x,int a,int b,int c,int d,int p)

int mid=(a+b)>>1;

if(c<=mid)tag(v,x<<1,a,mid,c,d,p);

if(d>mid)tag(v,x<<1|1,mid+1,b,c,d,p);

}void dfs(int x,int a,int b)

int mid=(a+b)>>1;

up(ta[x<<1],ta[x]),up(ta[x<<1|1],ta[x]);

up(tb[x<<1],tb[x]),up(tb[x<<1|1],tb[x]);

dfs(x<<1,a,mid),dfs(x<<1|1,mid+1,b);

}int main()

dfs(1,0,n-1);

return 0;

}

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 識別子串

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