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

2022-05-26 23:33:12 字數 1476 閱讀 9167

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

解題思路:對於乙個字尾sa[k],它產生了n-sa[k]個字首,減去height[k]個相同的字首(與前乙個比較),則產生了n-sa[k]-height[k]個子串。累加後即結果。

view code

1/*2

*author: zhaofa fang

3*created time: 2013-04-21-21.19

4*language: c++5*/

6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14 #include 15 #include 16 #include 17 #include 18 #include

19using

namespace

std;

2021 typedef long

long

ll;22

#define debug(x) cout<< #x << ':' << x << endl

23#define for(i,s,t) for(int i = (s);i <= (t);i++)

24#define ford(i,s,t) for(int i = (s);i >= (t);i--)

25#define rep(i,n) for(i,0,n-1)

26#define repd(i,n) ford(i,n-1,0)

27#define pii pair28

#define pb push_back

29#define mp make_pair

30#define ft first

31#define sd second

32#define lowbit(x) (x&(-x))

33#define inf (1<<30)

3435

const

int maxn = 1111;36

char

s[maxn];

37int

sa[maxn],t1[maxn],t2[maxn],c[maxn];

38int

rank[maxn],height[maxn];

3940

void getheight(int

n)49}50

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

l)53

void build_sa(int m,int

n)72 getheight(n-1

);73}74

int solve(int

n)79

return

ans;80}

81int

main()

92return0;

93 }

SPOJ705 不同的子串

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

SPOJ705 不同的子串

給定乙個字串,計算其不同的子串個數。一行乙個僅包含大寫字母的字串,長度 50000 一行乙個正整數,即不同的子串個數。ababa 題解 顯然字尾可以是乙個子串,然後字尾中可能包含多個子串。我們考慮不重複統計,容易發現 乙個字尾的貢獻為l high i 1 因為high i 之前的顯然可以在後面的串中...

spoj705 求不相同的子串個數

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