BZOJ 4516 字尾陣列 ST set

2021-07-26 12:22:48 字數 789 閱讀 5642

寫了一半 沒了啊啊啊     重新寫的

思路:

先不考慮字尾自動機   (我不會啊)

那這道題只能用字尾陣列了

先把原串倒一下  字尾->字首

相當於每回在前面加了乙個字母

求不同的子串個數 

首先 正常的求子串個數我們是會的 spoj 705

但是這道題比較坑 它讓你每回都輸出一下

那只好 維護乙個前驅 乙個後繼 求lcp 取max

ans=ans+n-i+1-max(lcp(),lcp())

用set維護前驅和後繼就好啦~

//by siriusren

#include

#include

#include

#include

using namespace std;

const int n=100050;

int n,s[n],sa[n],tsa[n],cnta[n],cntb[n],a[n],b[n],rk[n],ht[n],f[n][20],log[n];

setset;long long ans;

void sa()

for(int i=1,j=0;i<=n;i++)

for(int j=1;j<=19;j++)

for(int i=1;i+(1<

f[i][j]=min(f[i][j-1],f[i+(1<

}int lcp(int x,int y)

int main()

}

BZOJ 4516 字尾自動機

題意 統計本質不同的子串數量。題解 模板題,字尾自動機。在每乙個節點處,統計一下他能代表多少個 以他為終點的串。然後動態建立sam,同時每加一次都輸出一次就行了。唯一的不同是,這個題是int,而不是傳統的字串,那麼把nxt陣列換成map,複雜度多乙個log sizeof nxt 實際上非常小。cod...

BZOJ4516 生成魔咒,字尾陣列 Splay

time 2016.05.28 author xiaoyimi 思路 考場上寫的60分kmp 學過字尾陣列的都知道,乙個串裡不同子串的個數 n sa i heig ht i 對於問題中串每次插入乙個數字,它實際上使長度增加了1,即 n n2 n 1 2,對答案的貢獻是2n 1,注意這裡的n不是總長,...

BZOJ 4516 生成魔咒

串串長度 n 1 05 n leq 10 5 n 10 5,串中元素x 1 09 x leq 10 9 x 10 9,問每加入乙個數後本質不同的子串數 裸的s am samsa m或者是離線sasa sa。這裡討論sasa sa做法。實際上問題就是把整個串翻轉一下 然後就相當於計算完每個串的貢獻以後...