首页 > 代码库 > 后缀数组
后缀数组
模板题
——代码
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 100005 5 6 int m = ‘z‘ + 1; 7 int len, buc[N], x[N], y[N], sa[N], rank[N], h[N]; 8 char s[N]; 9 10 inline void build_sa()11 {12 scanf("%s", s); len = strlen(s);13 int i, k, p;14 for(i = 0; i < m; i++) buc[i] = 0;15 for(i = 0; i < len; i++) buc[x[i] = s[i]]++;16 for(i = 1; i < m; i++) buc[i] += buc[i - 1];17 for(i = len - 1; i >= 0; i--) sa[--buc[x[i]]] = i;18 for(k = 1; k <= len; k <<= 1)19 {20 p = 0;21 for(i = len - 1; i >= len - k; i--) y[p++] = i;22 for(i = 0; i < len; i++) if(sa[i] >= k) y[p++] = sa[i] - k;23 for(i = 0; i < m; i++) buc[i] = 0;24 for(i = 0; i < len; i++) buc[x[y[i]]]++;25 for(i = 1; i < m; i++) buc[i] += buc[i - 1];26 for(i = len - 1; i >= 0; i--) sa[--buc[x[y[i]]]] = y[i];27 std::swap(x, y);28 p = 1, x[sa[0]] = 0;29 for(i = 1; i < len; i++)30 x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k] ? p - 1 : p++;31 if(p >= len) break;32 m = p;33 }34 }35 36 int main()37 {38 int i, j, k = 0;39 build_sa();40 for(i = 0; i < len; i++) printf("%d ", sa[i] + 1);41 puts("");42 for(i = 0; i < len; i++) rank[sa[i]] = i;43 for(i = 0; i < len; i++)44 {45 if(rank[i] == 0)46 {47 h[0] = 0;48 continue;49 }50 if(k) k--;51 j = sa[rank[i] - 1];52 while(s[i + k] == s[j + k] && i + k < len && j + k < len) k++;53 h[rank[i]] = k;54 }55 for(i = 1; i < len; i++) printf("%d ", h[i]);56 puts("");57 return 0;58 }
有关后缀数组的讲解
后缀数组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。