Advertisement
overwater

Untitled

Mar 5th, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. string s;
  8. vector <long long> h;
  9. vector <int> suff;
  10. vector <long long> degrees;
  11.    
  12. long long module = 10000000019;
  13. long long c = 31;
  14.  
  15.  
  16. bool comp_suff(int, int);
  17.  
  18. void initialize() {
  19.     cin >> s;
  20.     h.resize(s.size());
  21.     h[0] = s[0] - 'a' + 1;
  22.     long long p = c;
  23.     degrees.push_back(c);
  24.     for (int i = 1; i < h.size(); ++i) {
  25.         h[i] = h[i - 1] + ((s[i] - 'a' + 1) * p);
  26.         p *= c;
  27.         degrees.push_back(p);
  28.     }
  29.     for (int i = s.size() - 1; i >= 0; --i)
  30.         suff.push_back(i);
  31.     sort(suff.begin(), suff.end(), comp_suff);
  32.     for (int i = 0; i < s.size(); ++i)
  33.         cout << suff[i] + 1 << ' ';
  34. }
  35.    
  36. bool comp_substr(int l1, int r1, int l2, int r2) {
  37.     if (r2 - l2 != r1 - l1)
  38.         return false;
  39.     else {
  40.         long long h1 = (l1 == 0) ? h[r1] : h[r1] - h[l1 - 1],
  41.             h2 = (l2 == 0) ? h[r2] : h[r2] - h[l2 - 1];
  42.        
  43.         if (l1 < l2)
  44.             h1 *= degrees[l2 - l1 - 1];
  45.         else
  46.             h2 *= degrees[l1 - l2 - 1];
  47.         if (h1 == h2)
  48.             return true;
  49.         else return false;
  50.     }
  51. }
  52.  
  53. int max_common_prefix(int a, int b) {
  54.     int left = 0, right = min(s.size() - a, s.size() - b) - 1;
  55.     int answer = -1;
  56.     while (left < right && right >= answer) {
  57.         int median = (left + right) / 2;
  58.         if (comp_substr(a, a + median, b, b + median)) {
  59.             answer = median;
  60.             left = median + 1;
  61.         }
  62.         else
  63.             right = median;
  64.     }
  65.     return answer;
  66. }
  67.  
  68. bool comp_suff(int a, int b) {
  69.     int k = max_common_prefix(a, b) + 1;
  70.     if (a + k == s.size() || (b + k != s.size() && s[a + k] < s[b + k]))
  71.         return true;
  72.     else
  73.         return false;
  74. }
  75.  
  76. int main() {   
  77.     initialize();
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement