Advertisement
Guest User

Untitled

a guest
Feb 21st, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:256000000")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #define _CRT_SECURE_NO_DEPRECATE
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<cstdlib>
  7. #include<string>
  8. #include<cstring>
  9. #include<algorithm>
  10. #include<cmath>
  11. #include <set>
  12. #include <queue>
  13. #include <map>
  14. #include <vector>
  15. #include <unordered_map>
  16. #include <assert.h>
  17.  
  18. using namespace std;
  19.  
  20. #define mp make_pair
  21. #define pub push_back
  22. #define con continue
  23. #define forn(i, n) for (int i = 0; i < int(n); ++i)
  24. #define fornr(i, n) for (int i = n - 1; i >= 0; --i)
  25. #define forab(i, a, b) for (int i = (a); i <= int(b); ++i)
  26. typedef long long ll;
  27. typedef pair <int, int> pii;
  28. typedef vector <int> vi;
  29. typedef vector < pii > vii;
  30. typedef vector < vector < int> > vvi;
  31. typedef vector < vector < pair < int, int > > > vvii;
  32.  
  33. const int ZEROS = (int)(1E+5 + 100);
  34. const int INF = (int)1E+9;
  35.  
  36. ll P[ZEROS];
  37. ll H[ZEROS];
  38. ll ppp = 1301, mod = 1E+9 + 7;
  39.  
  40. int n;
  41. string s;
  42. vi p;
  43.  
  44. void gen_hash() {
  45.     ll a = 1;
  46.     for (int i = 1; i <= n; ++i) {
  47.         P[i] = a;
  48.         a *= ppp;
  49.         a %= mod;
  50.     }
  51.     for (int i = 1; i <= n; ++i)
  52.         H[i] = (H[i - 1] + ((s[i - 1]) * P[i]) % mod) % mod;
  53. }
  54.  
  55. ll get_hash(int l, int r) {
  56.     return (((H[r] - H[l - 1] + mod) % mod) * P[n - r + 1])
  57.         % mod;
  58. }
  59.  
  60. int eq(int l1, int r1, int l2, int r2) {
  61.     ll h1 = get_hash(l1, r1);
  62.     ll h2 = get_hash(l2, r2);
  63.     return h1 == h2;
  64. }
  65.  
  66. bool comp(int x, int y) {
  67.     int l = 1; int r = min(n - x, n - y);
  68.     int ans = 0;
  69.     while (l <= r) {
  70.         int mid = (l + r) / 2;
  71.         if (eq(x, x + mid - 1, y, y + mid - 1)) {
  72.             l = mid + 1;
  73.             ans = mid;
  74.         }
  75.         else
  76.             r = mid - 1;
  77.     }
  78.  
  79.     if (x + ans <= n && y + ans <= n) {
  80.         bool u = (s[x + ans] < s[y + ans]);
  81.         return u;
  82.     }
  83.     else {
  84.         bool u = (x > y);
  85.         return u;
  86.     }
  87. }
  88.  
  89. void solve() {
  90.     forn(i, (int)s.size())
  91.         p.push_back(i + 1);
  92.     sort(p.begin(), p.end(), comp);
  93. }
  94.  
  95. int main() {
  96. #ifdef  _DEBUG
  97.     freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
  98. #endif
  99.     ios_base::sync_with_stdio(0);
  100.     cin.tie(0);
  101.  
  102.     getline(cin, s);
  103.     n = (int)s.size();
  104.     gen_hash();
  105.     solve();
  106.     forn(i, n)
  107.         cout << p[i] << " ";
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement