[关闭]
@ivorysi 2018-01-02T12:31:20.000000Z 字数 1384 阅读 649

后缀数组学习笔记

未分类


  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <vector>
  6. //#define ivorysi
  7. #define MAXN 20005
  8. using namespace std;
  9. typedef long long ll;
  10. int ra[MAXN],sa[MAXN];
  11. int n,num[MAXN],str[MAXN],tmpa[MAXN],tmpb[MAXN],val[MAXN],sum[MAXN],height[MAXN];
  12. bool cmp(int *arr,int s,int t,int l) {
  13. return arr[s] == arr[t] && arr[s + l] == arr[t + l];
  14. }
  15. void suffix(int len,int sc) {
  16. int *tmpra = tmpa,*tmpsa = tmpb;
  17. for(int i = 1 ; i <= sc ; ++i) sum[i] = 0;
  18. for(int i = 1 ; i <= len ; ++i) ++sum[tmpra[i] = str[i]];
  19. for(int i = 1 ; i <= sc ; ++i) sum[i] += sum[i - 1];
  20. for(int i = len ; i >= 1 ; --i) sa[sum[str[i]]--] = i;
  21. int all = 0;
  22. for(int j = 1 ; all < len ; j *= 2 , sc = all) {
  23. int l = 0;
  24. for(int k = len - j + 1 ; k <= len ; ++k) tmpsa[++l] = k;
  25. for(int k = 1 ; k <= len ; ++k) if(sa[k] > j) tmpsa[++l] = sa[k] - j;
  26. for(int k = 1 ; k <= len ; ++k) val[k] = tmpra[tmpsa[k]];
  27. for(int k = 1 ; k <= sc ; ++k) sum[k] = 0;
  28. for(int k = 1 ; k <= len ; ++k) sum[val[k]]++;
  29. for(int k = 1 ; k <= sc ; ++k) sum[k] += sum[k - 1];
  30. for(int k = len ; k >= 1 ; --k) sa[sum[k]--] = tmpsa[k];
  31. swap(tmpra,tmpsa);
  32. tmpra[sa[1]] = 1;
  33. for(all = 1 , int k = 2 ; k <= len ; ++k)
  34. tmpra[sa[k]] = cmp(tmpsa,sa[k],sa[k - 1],j) ? all : ++all;
  35. sc = all;
  36. }
  37. for(int i = 1 ; i <= len ; ++i) ra[sa[i]] = i;
  38. }
  39. int main() {
  40. #ifdef ivorysi
  41. freopen("f1.in","r",stdin);
  42. #endif
  43. while(scanf("%d",&n)) {
  44. for(int i = 1 ; i <= n ; ++i) scanf("%d",&num[i]);
  45. for(int i = 1 ; i < n ; ++i) str[i] = num[i + 1] - num[i] + 89;
  46. str[n] = 1;
  47. suffix(n,180);
  48. for(int i = 1 ; i < n ; ++i) {
  49. int k = max(height[i - 1] - 1,1);
  50. while(i + k <= n && sa[ra[i] - 1] + k <= n && str[i + k] == str[sa[ra[i] - 1] + k]) ++k;
  51. height[i] = k;
  52. }
  53. int l = 0 , r = n;
  54. while(l < r) {
  55. int mid = (l + r) >> 1;
  56. }
  57. }
  58. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注