spoj 694 不相同的子串的個數

2021-06-07 05:51:41 字數 1311 閱讀 4619

**:《字尾陣列---處理字串的有力工具》

題目大意:要求求乙個字串中不同子串的個數

解題思路:利用字尾陣列,每個子串一定是某個字尾子串的字首,求多少個不同的子串等價於求出所有字尾之間的不相同的字首的個數。

設字串為str,sa[i]表示排名第i的字尾從str的第sa[i]個位置開始,rank[i]表示str[i]開始的字尾排第幾位

height[i]表示sa[i]和sa[i-1]的公共字首為多少。

按照suffix(sa[1]), suffix(sa[2]),....suffix(sa[n])的順序計算,每加入乙個suffix(sa[i]),就產生n - sa[i] + 1個新字首。其中height[i]個是和前面的字尾子串的字首是相同的

所以suffix(sa[i])將貢獻n-sa[i]+1-height[i]個不同的子串

#include #include #include using namespace std;

const int maxn = 1010;

char str[maxn];

int wx[maxn], wy[maxn], c[maxn], height[maxn], sa[maxn], rank[maxn];

inline bool cmp(int *s, int a, int b, int l);

void suffix(char *s, int n, int m);

void cal_height(char *s, int *sa, int n);

int main()

return 0;

}inline bool cmp(int *s, int a, int b, int l)

void suffix(char *s, int n, int m)

for(int i = 0; i < m; i++)

c[i] = 0;

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

c[x[y[i]]]++;

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

c[i] += c[i-1];

for(int i = n - 1; i >= 0; i--)

sa[--c[x[y[i]]]] = y[i];

t = x; x = y; y = t;

x[sa[0]] = rank[sa[0]] = 0;

index = 1;

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

}}void cal_height(char *s, int *sa, int n)

}

SPOJ 694不同子串個數

求乙個字串的不同子串個數。字尾陣列求出sa和height 每 乙個 字尾sa i 貢 獻n 1 sa i 個前 綴,減去 heig ht i 就是和 前乙個後 綴相同的 字首個數 累加就 是答 案每乙個字尾sa i 貢獻n 1 sa i 個字首,減去height i 就是和前乙個字尾相同的字首個數,...

spoj705 求不相同的子串個數

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

1166不相同的子串的個數 字尾陣列

題目描述 給定乙個字串,求不相同的子串的個數。輸入 輸入資料第一行為乙個數字 t,表示資料組數。t 10 接下來的 t 行,每行乙個由小寫或大寫字母構成的字串,字串長度不超過 50000。輸出 對於每組資料,輸出一行乙個數字,表示答案。樣例輸入 4 abbabba dabddkababa bacab...