fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int p = 31;
  12. const int MOD = 1e9 + 9277;
  13. const int N = 1e6 + 5;
  14.  
  15. int n;
  16. string s;
  17.  
  18. int p_pow[2 * N], h[2 * N];
  19.  
  20. void precompute() {
  21. p_pow[0] = 1;
  22. for (int i = 1; i <= 2 * n; i++) {
  23. p_pow[i] = 1ll * p_pow[i - 1] * p % MOD;
  24. }
  25.  
  26. h[0] = 0;
  27. for (int i = 1; i <= 2 * n; i++) {
  28. h[i] = (1ll * h[i - 1] * p + (s[i] - 'a' + 1)) % MOD;
  29. }
  30. }
  31.  
  32. int getHash(int l, int r) {
  33. return (h[r] - 1ll * h[l - 1] * p_pow[r - l + 1] % MOD + MOD) % MOD;
  34. }
  35.  
  36. // So sánh thứ tự từ điển của 2 xâu độ dài n bắt đầu tại vị trí i và vị trí j của xâu s
  37. // -1: <
  38. // 0: =
  39. // 1: >
  40. int compare(int i, int j) {
  41. int l = 1, r = n, lcp = 0; // lcp (longest common prefix): độ dài tiền tố chung dài nhất
  42. while (l <= r) {
  43. int mid = (l + r) >> 1;
  44. if (getHash(i, i + mid - 1) == getHash(j, j + mid - 1)) {
  45. lcp = mid;
  46. l = mid + 1;
  47. }
  48. else {
  49. r = mid - 1;
  50. }
  51. }
  52.  
  53. if (lcp == n) return 0;
  54. if (s[i + lcp] < s[j + lcp]) return -1;
  55. return 1;
  56. }
  57.  
  58. int main() {
  59. ios::sync_with_stdio(false);
  60. cin.tie(nullptr);
  61. cin >> s;
  62. n = s.size();
  63.  
  64. // Sau khi nhân đôi xâu s thì mỗi xâu con độ dài n của xâu s lúc này
  65. // tương ứng với một xâu nhận được sau khi thực hiện thao tác shift trên xâu s ban đầu
  66. s = ' ' + s + s;
  67.  
  68. precompute();
  69.  
  70. // vị trí bắt đầu của xâu có thứ tự từ điển nhỏ nhất
  71. int min_pos = 1;
  72. for (int i = 1; i <= n; i++) {
  73. if (compare(i, min_pos) == -1) min_pos = i;
  74. }
  75.  
  76. for (int i = min_pos; i <= min_pos + n - 1; i++) cout << s[i];
  77. }
Success #stdin #stdout 0.01s 5616KB
stdin
acab
stdout
abac