SPOJ DISUBSTR 字尾陣列

2022-08-31 04:03:06 字數 1261 閱讀 2496

題意:給定乙個字串,求不相同的子串個數。

思路:直接根據09年oi**《字尾陣列——出來字串的有力工具》的解法。

還有另一種思想:總數為n*(n-1)/2,height[i]是兩個字尾的最長公共字首,所以用總數-height[i]的和就是答案

#define _crt_secure_no_deprecate#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

intll;

const

int maxn = 1000 + 5

;int cmp(int *r, int a, int b, int

l)int

wa[maxn], wb[maxn], wv[maxn], ws[maxn];

void da(int *r, int *sa, int n, int

m)

return;}

intrank[maxn], height[maxn],sa[maxn];

void calheight(int *r, int *sa, int

n)void solve(int

n) printf(

"%d\n

", ans);

}int

t, len,r[maxn];

char

str[maxn];

intmain() //

字串最後新增乙個

//小於所以字元的值

r[i] = (int

)str[i];

} da(r, sa, len+1, 256

); calheight(r, sa, len);

solve(len);

}//#ifdef local_time

//cout << "[finished in " << clock() - start << " ms]" << endl;

//#endif

return0;

}

字尾樹 字尾陣列

在字串處理當中,字尾樹和字尾陣列都是非常有力的工具,其中字尾樹大家了解得比較多,關於字尾陣列則很少見於國內的資料。其實字尾陣列是字尾樹的乙個非 常精巧的替代品,它比字尾樹容易程式設計實現,能夠實現字尾樹的很多功能而時間複雜度也不太遜色,並且,它比字尾樹所占用的空間小很多。可以說,在資訊學競賽 中字尾...

字尾樹 字尾陣列

我們考慮將乙個串的所有字尾插入乙個trie中,得到的trie就是字尾trie。我們可以發現,樹上有分叉或者是字尾節點的點的個數是o l en o len o len 個,這個後面解釋,於是把沒有分支並且不是字尾節點的點壓縮到一起,就變成了字尾樹。不難發現,字尾樹可以表示該字串的所有子串。下面分析一下...

字尾樹與字尾陣列

字尾樹和字尾陣列是字串處理的兩大神器,幾乎可處理掉一切的字串處理問題,但是在實際中,字尾陣列比字尾樹更好寫 好調,同時時間上也不差 常數很小 所以字尾陣列絕對是oi競賽之必備神器。字尾樹,實際上就是一棵字典樹。考慮將某個串 s 的所有字尾插到一棵trie裡,那麼我們就得到了一棵字尾樹。在這裡,我們不...