Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <bits/stdc++.h>
- using namespace std;
- const int N = 5e5 + 5;
- string s;
- pair <int, int> a[N];
- long long pw[N], h[N], pr = 997, mod = 1e9 + 7;
- int n;
- long long get(int l, int r){
- long long hs = (h[r] - h[l - 1] + mod) % mod;
- hs = (hs * pw[N - l]) % mod;
- return hs;
- }
- bool ok(pair <int, int> a, pair <int, int> b){
- if(get(a.first, a.second) == get(b.first, b.second)) return 1;
- int lo = 0, hi = n - 1;
- while(lo < hi){
- int md = (lo + hi) >> 1;
- if(get(a.first, a.first + md) == get(b.first, b.first + md))
- lo = md + 1;
- else
- hi = md;
- }
- return s[a.first + lo] < s[b.first + lo];
- }
- pair <int, int> fun(int l, int r){
- if(l == r){
- return a[l];
- }
- int m = (l + r) >> 1;
- pair <int, int> r1 = fun(l, m);
- pair <int, int> r2 = fun(m + 1, r);
- if(ok(r1, r2))
- return r1;
- else
- return r2;
- }
- int main(){
- pw[0] = pr;
- for(int i = 1; i < N; i ++){
- pw[i] = (pw[i - 1] * pr) % mod;
- }
- cin >> s;
- n = s.size();
- s = ' ' + s + s;
- for(int i = 1; i < s.size(); i ++){
- h[i] = (h[i - 1] + (pw[i] * s[i]) % mod) % mod;
- }
- for(int i = 1; i <= n; i++){
- a[i] = {i, i + n - 1};
- }
- pair <int, int> p = fun(1, n);
- string ans;
- for(int i = p.first; i <= p.second; i ++)
- ans += s[i];
- cout << ans << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement