題意:給定乙個字串,求不相同的子串個數。
思路:直接根據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裡,那麼我們就得到了一棵字尾樹。在這裡,我們不...