Advertisement
yeskendir_sultanov

G. Пароль

Mar 5th, 2025
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. #define ull unsigned long long
  3.  
  4. using namespace std;
  5.  
  6. const int N = 1e6 + 3;
  7. const ull base = 29;
  8.  
  9. ull h[N], b[N];
  10. string s;
  11. int n;
  12.  
  13. ull get(int i, int j) {
  14.     if (i == 0) {
  15.         return h[j];
  16.     }
  17.     return (h[j] - h[i - 1] * b[j - i + 1]);
  18. }
  19.  
  20. bool check(int len) {
  21.     auto pref = get(0, len - 1);
  22.    
  23.     for (int i = 1, j = len; j + 1 < n; ++i, ++j) {
  24.         if (pref == get(i, j)) {
  25.             return true;
  26.         }
  27.     }    
  28.    
  29.     return false;
  30. }
  31.  
  32. int main() {
  33.     ios_base::sync_with_stdio(NULL);
  34.     cin.tie(0); cout.tie(0);
  35.     cin >> s;
  36.     n = s.size();
  37.     b[0] = 1;
  38.     for (int i = 1; i <= n; ++i) {
  39.         b[i] = b[i - 1] * base;
  40.     }
  41.     h[0] = s[0];
  42.  
  43.     for (int i = 1; i < n; ++i) {
  44.         h[i] = (h[i - 1] * base + s[i]);
  45.     }
  46.    
  47.     vector<int> d;
  48.     for (int i = 0; i + 1 < n; ++i) {
  49.         if (get(0, i) == get(n - 1 - i, n - 1)) {
  50.             d.push_back(i + 1);
  51.         }
  52.     }
  53.    
  54.     int low = 0, high = d.size() - 1, ans = 0;
  55.     while (low <= high) {
  56.         int mid = (low + high) / 2;
  57.         int len = d[mid];
  58.         if (check(len)) {
  59.             ans = len;
  60.             low = mid + 1;
  61.         } else {
  62.             high = mid - 1;
  63.         }
  64.     }
  65.    
  66.     if (ans > 0) {
  67.         cout << s.substr(0, ans);
  68.     } else {
  69.         cout << "Just a legend";
  70.     }
  71.     return 0;
  72. }
  73.  
  74.  
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement