SPOJ705 不同的子串

2022-05-11 11:57:24 字數 749 閱讀 7176

給定乙個字串,計算其不同的子串個數。

一行乙個僅包含大寫字母的字串,長度<=50000

一行乙個正整數,即不同的子串個數。

ababa

題解:

顯然字尾可以是乙個子串,然後字尾中可能包含多個子串。

我們考慮不重複統計,容易發現 乙個字尾的貢獻為l-high[i]+1

因為high[i]之前的顯然可以在後面的串中被統計到,所以可以避免重複

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

using

namespace

std;

8const

int n=50005;9

char s[n];int

n,k,rk[n],sa[n],tmp[n],high[n];

10bool comp(int i,int

j)16

void

getsa()23}

24void

gethight()32}

33void

getanswer()

39 printf("

%lld\n

",ans);40}

41int

main()

42

SPOJ705 不同的子串

我是萌萌的傳送門 看來我的做法也沒錯嘛.看別人的 寫字尾陣列的好像是利用sa和height什麼的搞一搞,看了看表示沒看懂 看了看字尾自動機眾的 好像是用什麼np len np par len更新答案,看了看表示理解不了 於是根據我對字尾自動機的理解強行yy了一發字尾自動機 dp的做法 我的想法是這樣...

spoj 705 求不同子串的個數(字尾陣列)

題意 給定乙個字串,求不相同的子串的個數。解題思路 對於乙個字尾sa k 它產生了n sa k 個字首,減去height k 個相同的字首 與前乙個比較 則產生了n sa k height k 個子串。累加後即結果。view code 1 2 author zhaofa fang 3 created...

spoj705 求不相同的子串個數

題意 求串s的不同子串的個數 解題思路 任何子串都是某個字尾的字首,對n個字尾排序,求某個字尾的字首的個數,減去height i 第i個字尾與第i 1 個字尾有相同的height i 個字首 如下 include include include include include include inc...