Advertisement
MystMe

Untitled

Oct 11th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8. const int alphabet = 27;
  9.  
  10. class suffix_array{
  11. public:
  12.     explicit suffix_array(const string& s);
  13.     ~suffix_array();
  14. private:
  15.     vector<int> suffix;
  16.     size_t size;
  17. };
  18. suffix_array::suffix_array(const string &s) {
  19.     size = s.size();
  20.     suffix.resize(size);
  21.     vector<int> cnt(alphabet);
  22.     vector<int> classes(size);
  23.     vector<int> p(size);
  24.  
  25.     for(int i = 0; i < size; i++){
  26.         cnt[s[i]-'a'] += 1;
  27.     }
  28.     for(int i = 1; i < alphabet; i++){
  29.         cnt[i] += cnt[i-1];
  30.     }
  31.     for(int i = 0; i < size; i++){
  32.         p[cnt[s[i]-'a'] - 1] = i;
  33.         cnt[s[i]-'a'] -= 1;
  34.     }
  35.     classes[p[0]] = 0;
  36.     int num_classes = 1;
  37.     for(int i = 1; i < size; i++){
  38.         if(s[p[i]] != s[p[i-1]]){
  39.             ++num_classes;
  40.         }
  41.         classes[p[i]] = num_classes-1;
  42.     }
  43.     vector<int> pn(size);
  44.     vector<int> cn(size);
  45.  
  46.     for(int h = 0; (1<<h)-1 < size; h++){
  47.         for(int i = 0; i < size; ++i) {
  48.             pn[i] = p[i] - (1 << h);
  49.             if (pn[i] < 0) {
  50.                 pn[i] += size;
  51.             }
  52.         }
  53.         cnt.assign(0, num_classes);
  54.         for(int i = 0; i < size; ++i){
  55.             ++cnt[classes[pn[i]]];
  56.         }
  57.         for (int i=1; i<num_classes; ++i) {
  58.             cnt[i] += cnt[i - 1];
  59.         }
  60.         for (int i=size-1; i>=0; --i) {
  61.             p[--cnt[classes[pn[i]]]] = pn[i];
  62.         }
  63.         cn[p[0]] = 0;
  64.         num_classes = 1;
  65.         for(int i = 1; i < size; ++i) {
  66.             int mid1 = (p[i] + (1<<h)) % size,  mid2 = (p[i-1] + (1<<h)) % size;
  67.             if (classes[p[i]] != classes[p[i-1]] || classes[mid1] != classes[mid2])
  68.                 ++num_classes;
  69.             cn[p[i]] = num_classes-1;
  70.         }
  71.         for(int i = 0; i < size; i++){
  72.             classes[i] = cn[i];
  73.         }
  74.     }
  75.    
  76.    
  77.     for(int i = 0; i < size; i++){
  78.         suffix[i] = p[i]+1;
  79.     }
  80.     bool flag = 1;
  81. }
  82. suffix_array::~suffix_array(){}
  83.  
  84.  
  85. int main() {
  86.     string s;   //  Исходная строка
  87.     cin >> s;
  88.  
  89.     suffix_array suff(s);
  90.  
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement