Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
- //#pragma GCC optimize("unroll-loops")
- //#pragma GCC optimize("Ofast")
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <algorithm>
- #include <queue>
- #include <set>
- #include <map>
- #include <string>
- #include <iomanip>
- using namespace std;
- typedef long long ll;
- #define pb push_back
- #define pii pair<int, int>
- #define mp make_pair
- #define F first
- #define S second
- #define sorted(a) sort(a.begin(), a.end())
- #define pop pop_back
- int len;
- bool check(string& s, vector <int>& a, int& mid) {
- for (int i = len - 1; i >= (mid * (mid + 1)) / 2 - 1; --i) {
- if (a[i] < mid) {
- continue;
- }
- else {
- bool ok = true;
- int part = mid;
- int j = i;
- while (part > 1) {
- j -= part;
- if (a[j] < part - 1) {
- ok = false;
- break;
- }
- part -= 1;
- }
- if (ok) return true;
- }
- }
- return false;
- }
- int main() {
- ios::sync_with_stdio(0);
- cin.tie(0); cout.tie(0);
- string s;
- cin >> s;
- len = (int)s.size();
- vector <int> a(len);
- a[0] = 1;
- for (int i = 1; i < len; ++i) {
- a[i] = ((s[i] == s[i - 1]) ? a[i - 1] + 1 : 1);
- }
- int left = 0, right = (int)sqrt(len) + 2;
- while (right - left > 1) {
- int mid = (right + left) / 2;
- if (check(s, a, mid)) {
- left = mid;
- }
- else {
- right = mid;
- }
- }
- string ans;
- for (int i = len - 1; i >= (left * (left + 1)) / 2 - 1; --i) {
- if (a[i] < left) {
- continue;
- }
- else {
- bool ok = true;
- int part = left;
- int j = i;
- string ss = "";
- while (part > 1) {
- for (int k = 0; k < part; ++k) {
- ss += s[j];
- }
- j -= part;
- if (a[j] < part - 1) {
- ok = false;
- break;
- }
- part -= 1;
- }
- if (ok) {
- ans = ss + s[j];
- reverse(ans.begin(), ans.end());
- break;
- }
- }
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement