Advertisement
Guest User

Suffix Array

a guest
Aug 18th, 2015
647
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. int N, C[100005], R[100005], SA[100005], TR[100005], TSA[100005];
  4. using namespace std;
  5.  
  6. void count_sort(int k)
  7. {
  8.     int sz = max(255,N-1);
  9.     for(int i = 0; i <= sz; i++) C[i] = 0;
  10.     for(int i = 0; i < N; i++) C[R[SA[i]+k]]++;
  11.     int sum = 0;
  12.     for(int i = 0; i <= sz; i++)
  13.     {
  14.         int temp = C[i];
  15.         C[i] = sum;
  16.         sum += temp;
  17.     }
  18.     for(int i = 0; i < N; i++) TSA[C[R[SA[i]+k]]++] = SA[i];
  19.     for(int i = 0; i < N; i++) SA[i] = TSA[i];
  20. }
  21.  
  22. int main()
  23. {
  24.     string s = "AAAA";
  25.     N = s.length();
  26.     for(int i = 0; i < N; i++) SA[i] = i, R[i] = s[i] - '.';
  27.     for(int k = 1; k < N; k *= 2)
  28.     {
  29.         count_sort(k);
  30.         count_sort(0);
  31.         int rank = 0;
  32.         TR[SA[0]] = 0;
  33.         for(int i = 1; i < N; i++) TR[SA[i]] = R[SA[i]] == R[SA[i-1]] && R[SA[i]+k] == R[SA[i-1]+k] ? rank : ++rank;
  34.         for(int i = 0; i < N; i++) R[i] = TR[i];
  35.     }
  36.     for(int i = 0; i < N; i++) cout << s.substr(SA[i]) << "\n";
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement