洛谷 SP705 字尾陣列

2022-06-29 15:39:09 字數 674 閱讀 4233

傳送門

回來複習一下字尾陣列,感覺之前不理解的地方突然都能理解了 >w<。

說實話字尾陣列比字尾自動機簡單。

這道題要求本質不同的子串數量,可以模擬字尾自動機的方法,字尾i貢獻的數量就是i的長度-height[rank[i]],因為之前那幾個字首和某乙個字尾的字首重複了。

#include using namespace std;

const int n=1e5+10;

char s[n];

int n,m,sa[n*2],rk[n*2],c[n],tp[n*2],ht[n*2],ans;

void getsa()

//根據height陣列的性質可以o(n)的求,即 ht[rk[i]]>=ht[rk[i-1]]-1

//很好證明,設字尾i-1與k的lcp=len,那麼字尾i至少與字尾k+1有lcp=len-1,

//因為這兩個字尾都是從前面那個字尾上扣了乙個字母下去嘛

int k=0;

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

ans=0;

for(int i=1;i<=n;i++) ans+=n-i+1-ht[rk[i]];

printf("%d\n",ans);

}void solve()

int main()

SP694 字尾陣列

求乙個字串本質不同的子串 考慮容斥 因為每乙個子串應該都是原串的乙個字尾的字首。因此重複的子串的總數應該就是所有字尾的hei gh theight height 陣列的和。a ns n n 1 2 i 1n heig ht i ans n n 1 2 sum height i ans n n 1 2...

洛谷P3181 字尾陣列

題目要求求出兩個兩個字串中相同子串的方案數,那麼我們將其拼接起來,去求出拼接後的字串中含有相同子串的數量。當然這樣做會求出同乙個字串中相同子串的數量,所以我們還需要如法炮製分別求出兩個字串中的答案,然後用總貢獻減去他們。那麼問題就變成了如何求出乙個字串中相同子串的數量。實際上這就是求任意兩個字尾x,...

洛谷 P3809 模板 字尾排序 字尾陣列

題目描述 讀入乙個長度為 n n 的由大小寫英文本母或數字組成的字串,請把這個字串的所有非空字尾按字典序從小到大排序,然後按順序輸出字尾的第乙個字元在原串中的位置。位置編號為 1 1 到 n n 輸入輸出格式 輸入格式 一行乙個長度為 n n 的僅包含大小寫英文本母或數字的字串。輸出格式 一行,共n...