日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > SPOJ - DISUBSTR Distinct Substrings(后綴數組求不相同的子串個數)

SPOJ - DISUBSTR Distinct Substrings(后綴數組求不相同的子串個數)

來源:程序員人生   發布時間:2014-10-10 08:00:00 閱讀次數:4084次

Description

Given a string, we need to find the total number of its distinct substrings.

Input

T- number of test cases. T<=20;
Each test case consists of one string, whose length is <= 1000

Output

For each test case output one number saying the number of distinct substrings.

Example

Sample Input:
2
CCCCC
ABABA

Sample Output:
5
9

Explanation for the testcase with string ABABA: 
len=1 : A,B
len=2 : AB,BA
len=3 : ABA,BAB
len=4 : ABAB,BABA
len=5 : ABABA
Thus, total number of distinct substrings is 9.

題意:給定一個字符串,求不相同的子串。
思路:每個子串一定是某個后綴的前綴,那么原問題等價于求所有后綴之間的不相同的前綴的個數。如果所有的后綴按照 suffix(sa[1]), suffix(sa[2]),
suffix(sa[3]), …… ,suffix(sa[n])的順序計算,不難發現,對于每一次新加
進來的后綴 suffix(sa[k]),它將產生 n-sa[k]個新的前綴。但是其中有height[k]個是和前面的字符串的前綴是相同的。所以 suffix(sa[k])將“貢獻”
出 n-sa[k]-height[k]個不同的子串。累加后便是原問題的答案。

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int maxn = 1010; int sa[maxn]; //SA數組,表示將S的n個后綴從小到大排序后把排好序的 //的后綴的開頭位置順次放入SA中 int t1[maxn], t2[maxn], c[maxn]; int rank[maxn], height[maxn]; int s[maxn]; char str[maxn]; void build_sa(int s[], int n, int m) { int i, j, p, *x = t1, *y = t2; for (i = 0; i < m; i++) c[i] = 0; for (i = 0; i < n; i++) c[x[i] = s[i]]++; for (i = 1; i < m; i++) c[i] += c[i-1]; for (i = n-1; i >= 0; i--) sa[--c[x[i]]] = i; for (j = 1; j <= n; j <<= 1) { p = 0; for (i = n-j; i < n; i++) y[p++] = i; for (i = 0; i < n; i++) if (sa[i] >= j) y[p++] = sa[i] - j; for (i = 0; i < m; i++) c[i] = 0; for (i = 0; i < n; i++) c[x[y[i]]]++; for (i = 1; i < m; i++) c[i] += c[i-1]; for (i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i]; swap(x, y); p = 1, x[sa[0]] = 0; for (i = 1; i < n; i++) x[sa[i]] = y[sa[i-1]] == y[sa[i]] && y[sa[i-1]+j] == y[sa[i]+j] ? p-1 : p++; if (p >= n) break; m = p; } } void getHeight(int s[],int n) { int i, j, k = 0; for (i = 0; i <= n; i++) rank[sa[i]] = i; for (i = 0; i < n; i++) { if (k) k--; j = sa[rank[i]-1]; while (s[i+k] == s[j+k]) k++; height[rank[i]]=k; } } int check(int n, int k, int mid) { int num = 1; for (int i = 2; i <= n; i++) { if (height[i] >= mid) { num++; if (num >= k) return 1; } else num = 1; } return 0; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%s", str); int n = strlen(str); for (int i = 0; i <= n; i++) s[i] = str[i]; build_sa(s, n+1, 128); getHeight(s, n); int ans = 0; for (int i = 1; i <= n; i++) ans += n - sa[i] - height[i]; printf("%d ", ans); } return 0; }

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 疯狂欧洲av久久成人av电影 | 玖玖操| 激情片网站 | 欧美日韩中文字幕 | 日韩av成人在线观看 | 日韩国产精品一区二区 | 欧美日韩亚洲一区 | 不用播放器的av网站 | 欧美精品久久久久久久免费软件 | 精品欧美一区二区久久久 | 福利网站在线观看 | h片在线免费观看 | 久久久久久久久国产精品 | av一区在线观看 | 亚洲一区二区三区四区在线视频 | 91精品国产91久久综合桃花 | 精品国产乱码一区二区三区 | 精品久久久久久亚洲 | 欧美激情视频一区二区三区不卡 | 在线国产一区 | 天天爱综合| 亚洲色图偷拍自拍 | 亚洲第一视频网 | www网站在线观看 | 日韩和的一区二在线 | 嫩草网址 | 亚洲成人精品 | 日韩 欧美 综合 | 国产精品久久久久久久久久98 | 国产精品国产三级国产a | 这里只有精品视频在线观看 | 免费日韩视频 | 日本久久久久久 | 国产精品美女视频 | 国产区在线看 | 国产精品射 | 九九热精品在线 | 国产一区二区欧美精品 | 欧美精品一区三区 | 夜夜摸夜夜操 | 色片视频|