Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// solution : https://pastebin.com/JiDCvA5T
- #include<bits/stdc++.h>
- using namespace std;
- typedef pair<int, int> ii;
- typedef unsigned long long ULL;
- const int N = 4e5 + 4, LOG = 20;
- int n, k, Up, Down;
- string S;
- ULL Pow[N], Hash[N];
- void Build_Hash() {
- for (int i = 0; i <= 2*n; ++i) Pow[i] = (i == 0) ? 1 : Pow[i-1] * 31LL;
- for (int i = 1; i <= 2*n; ++i) Hash[i] = Hash[i-1] * 31LL + S[i] - '0';
- }
- ULL getHash(int i, int j) { return Hash[j] - Hash[i-1] * Pow[j-i+1]; }
- struct data {
- int l, r;
- data() {}; data(int l, int r) : l(l), r(r) {};
- bool operator < (const data &a) const {
- int low = 1, high = r-l+1, Equal = 0;
- while (low <= high) {
- int mid = (low + high) / 2;
- if (getHash(l, l+mid-1) == getHash(a.l, a.l+mid-1)) { Equal = mid; low = mid + 1; }
- else high = mid - 1;
- }
- // cerr << S[7] << " " << S[8] << '\n';
- // cerr << Equal << '\n';
- // cerr << "^^ " << l << " " << r << " " << a.l << " " << a.r << '\n';
- // cerr << "%% " << l+Equal-1 << " " << S[l+Equal-1] << '\n';
- // cerr << S[l+Equal] << " " << S[a.l+Equal] << '\n';
- if (Equal == r-l+1) return false;
- return S[l+Equal] < S[a.l+Equal];
- }
- };
- vector<data> V;
- int par[N][LOG+4];
- int Jump(int u, int step) {
- for (int i = LOG; i >= 0; --i)
- if (step - (1<<i) >= 0) u = par[u][i], step -= (1<<i);
- return (step == 0) ? u : -1;
- }
- bool check(int mid) {
- for (int i = 1; i <= 2*n; ++i) par[i][0] = -1;
- for (int i = 0; i <= mid; ++i) par[V[i].l][0] = V[i].r+1;
- for (int i = 1; i <= 2*n; ++i)
- if (par[i][0] == -1) par[i][0] = i + Down;
- for (int j = 1; j <= LOG; ++j) for (int i = 1; i <= 2*n; ++i)
- par[i][j] = par[par[i][j-1]][j-1];
- for (int i = 1; i <= 2*n; ++i) {
- int ver = Jump(i, k);
- if (ver - i >= n) return true;
- }
- return false;
- }
- void sol() {
- Build_Hash();
- if (n % k == 0) { Up = n/k; Down = n/k-1; }
- else { Up = n/k + 1; Down = n/k; }
- for (int i = 1; i <= 2*n; ++i)
- if (i + Up - 1 <= 2*n) V.push_back(data(i, i+Up-1));
- sort(V.begin(), V.end());
- int l = 0, r = (int) V.size(), res = -1;
- while (l <= r) {
- int mid = (l + r) / 2;
- if (check(mid)) { res = mid; r = mid - 1; }
- else l = mid + 1;
- }
- cout << S.substr(V[res].l, Up) << '\n';
- }
- int main() {
- ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- if (fopen("input.txt", "r")) {
- freopen("input.txt", "r", stdin);
- }
- else if (fopen("B.in", "r")) {
- freopen("B.in", "r", stdin);
- }
- cin >> n >> k >> S;
- S = " " + S + S;
- sol();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement