Advertisement
Guest User

Untitled

a guest
Aug 19th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.47 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. //#include <ext/pb_ds/detail/standard_policies.hpp>
  4. //#include <ext/pb_ds/assoc_container.hpp>
  5. //#include <ext/pb_ds/tree_policy.hpp>
  6.  
  7. //#pragma GCC optimize("Ofast")
  8. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4")
  9.  
  10. #define ll long long
  11. #define ld long double
  12. #define pb push_back
  13. #define F first
  14. #define S second
  15. #define endl '\n'
  16. //#define int long long
  17.  
  18. using namespace std;
  19.  
  20. //using namespace __gnu_pbds;
  21. //template <typename T> using ordered_set = tree <T, null_type, less < T >, rb_tree_tag, tree_order_statistics_node_update>;
  22.  
  23. const int N = 1e5 + 5000;
  24. const int M = 32;
  25. const ll mod = 1e9 + 7;
  26. const ll MOD = 998244353;
  27. const int P = 1336;
  28. const ld eps = 0.000000001;
  29. const int inf = 1e9;
  30.  
  31. mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
  32.  
  33. int g[M][N], a[N], p[N], lcp[N], lc[N];
  34.  
  35. int32_t main()
  36. {
  37. ios_base::sync_with_stdio(0);
  38. cin.tie(0);
  39. cout.tie(0);
  40. srand(time(0));
  41.  
  42. freopen("input.txt", "r", stdin);
  43. freopen("output.txt", "w", stdout);
  44.  
  45. string s;
  46. getline(cin, s);
  47. int n = s.size();
  48. vector < pair <int, int> > v;
  49. for(int i = 0; i<n; i++)
  50. {
  51. v.pb({int32_t(s[i]) - 31, i});
  52. }
  53. sort(v.begin(), v.end());
  54. int uk = 0;
  55. for(int i = 0; i<v.size(); i++)
  56. {
  57. if (!(i && v[i].F == v[i-1].F)) uk++;
  58. g[0][v[i].S] = uk;
  59. }
  60. int m = 1;
  61. while ((1 << m) < n) m++;
  62. for(int j = 1; j <= m; j++)
  63. {
  64.  
  65. vector < pair < pair <int, int>, int> > b;
  66. int len = (1 << j); len /= 2;
  67. for(int i = 0; i<n; i++)
  68. {
  69. if (i + len > n) b.pb({{g[j-1][i], 0}, i});
  70. else b.pb({{g[j-1][i], g[j-1][i+len]}, i});
  71. }
  72. sort(b.begin(), b.end());
  73. uk = 0;
  74. for(int i = 0; i<b.size(); i++)
  75. {
  76. if (!(i && b[i].F == b[i-1].F)) uk++;
  77. g[j][b[i].S] = uk;
  78. }
  79. }
  80. for(int i = 0; i<n; i++)
  81. {
  82. a[g[m][i]-1] = i;
  83. }
  84. for(int i = 0; i<n; i++)
  85. {
  86. p[i] = a[g[m][i]];
  87. cout << p[i] << " ";
  88. }
  89. for(int i = 0; i<n; i++)
  90. {
  91. if (i) lc[i] = max(0, lc[i-1] - 1);
  92. while (i + lc[i] < s.size() && p[i] + lc[i] < s.size() && s[i + lc[i]] == s[p[i] + lc[i]])
  93. {
  94. lc[i]++;
  95. }
  96. lcp[g[m][i]-1] = lc[i];
  97. }
  98. cout << endl;
  99.  
  100. for(int i = 0; i<n; i++)
  101. {
  102. cout << lcp[i] << " ";
  103. }
  104.  
  105.  
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement