Advertisement
he_obviously

Untitled

Apr 30th, 2020
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
  2. //#pragma GCC optimize("unroll-loops")
  3. //#pragma GCC optimize("Ofast")
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <queue>
  10. #include <set>
  11. #include <map>
  12. #include <string>
  13. #include <iomanip>
  14.  
  15. using namespace std;
  16.  
  17. typedef long long ll;
  18.  
  19. #define pb push_back
  20. #define pii pair<int, int>
  21. #define mp make_pair
  22. #define F first
  23. #define S second
  24. #define sorted(a) sort(a.begin(), a.end())
  25. #define pop pop_back
  26.  
  27. int len;
  28.  
  29. bool check(string& s, vector <int>& a, int& mid) {
  30.     for (int i = len - 1; i >= (mid * (mid + 1)) / 2 - 1; --i) {
  31.         if (a[i] < mid) {
  32.             continue;
  33.         }
  34.         else {
  35.             bool ok = true;
  36.             int part = mid;
  37.             int j = i;
  38.             while (part > 1) {
  39.                 j -= part;
  40.                 if (a[j] < part - 1) {
  41.                     ok = false;
  42.                     break;
  43.                 }
  44.                 part -= 1;
  45.             }
  46.             if (ok) return true;
  47.         }
  48.     }
  49.     return false;
  50. }
  51.  
  52. int main() {
  53.     ios::sync_with_stdio(0);
  54.     cin.tie(0); cout.tie(0);
  55.     string s;
  56.     cin >> s;
  57.     len = (int)s.size();
  58.     vector <int> a(len);
  59.     a[0] = 1;
  60.     for (int i = 1; i < len; ++i) {
  61.         a[i] = ((s[i] == s[i - 1]) ? a[i - 1] + 1 : 1);
  62.     }
  63.     int left = 0, right = (int)sqrt(len) + 2;
  64.     while (right - left > 1) {
  65.         int mid = (right + left) / 2;
  66.         if (check(s, a, mid)) {
  67.             left = mid;
  68.         }
  69.         else {
  70.             right = mid;
  71.         }
  72.     }
  73.     string ans;
  74.     for (int i = len - 1; i >= (left * (left + 1)) / 2 - 1; --i) {
  75.         if (a[i] < left) {
  76.             continue;
  77.         }
  78.         else {
  79.             bool ok = true;
  80.             int part = left;
  81.             int j = i;
  82.             string ss = "";
  83.             while (part > 1) {
  84.                 for (int k = 0; k < part; ++k) {
  85.                     ss += s[j];
  86.                 }
  87.                 j -= part;
  88.                 if (a[j] < part - 1) {
  89.                     ok = false;
  90.                     break;
  91.                 }
  92.                 part -= 1;
  93.             }
  94.             if (ok) {
  95.                 ans = ss + s[j];
  96.                 reverse(ans.begin(), ans.end());
  97.                 break;
  98.             }
  99.         }
  100.     }
  101.     cout << ans;
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement