func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e6 + 100;   char ch[maxn];   namespace Suffix_Array {   int cntA[maxn], cntB[maxn], tsa[maxn], A[maxn], B[maxn];   int sa[maxn], rkrk[maxn], height[maxn];   void GetSa(char *ch, int n) {     for (int i = 0; i < maxn; i++) cntA[i] = 0;     for (int i = 1; i <= n; i++) cntA[ch[i]]++;     for (int i = 1; i <= maxn; i++) cntA[i] += cntA[i - 1];     for (int i = n; i; i--) sa[cntA[ch[i]]--] = i;     rkrk[sa[1]] = 1;     for (int i = 2; i <= n; i++) {       rkrk[sa[i]] = rkrk[sa[i - 1]];       if (ch[sa[i]] != ch[sa[i - 1]]) rkrk[sa[i]]++;     }     for (int l = 1; rkrk[sa[n]] < n; l <<= 1) {       for (int i = 0; i < maxn; i++) cntA[i] = 0;       for (int i = 0; i < maxn; i++) cntB[i] = 0;       for (int i = 1; i <= n; i++) {         cntA[A[i] = rkrk[i]]++;         cntB[B[i] = (i + l <= n) ? rkrk[i + l] : 0]++;       }       for (int i = 1; i < maxn; i++) cntB[i] += cntB[i - 1];       for (int i = n; i; i--) tsa[cntB[B[i]]--] = i;       for (int i = 1; i < maxn; i++) cntA[i] += cntA[i - 1];       for (int i = n; i; i--) sa[cntA[A[tsa[i]]]--] = tsa[i];       rkrk[sa[1]] = 1;       for (int i = 2; i <= n; i++) {         rkrk[sa[i]] = rkrk[sa[i - 1]];         if (A[sa[i]] != A[sa[i - 1]] || B[sa[i]] != B[sa[i - 1]]) rkrk[sa[i]]++;       }     }   }   };  // namespace Suffix_Array   int sum[maxn];   struct Segment_Tree {     int Min[maxn * 8];     void up(int x) { Min[x] = min(Min[x << 1], Min[x << 1 | 1]); }     void build(int x, int l, int r) {       if (l == r) {         Min[x] = sum[l];         return;       }       int mid = l + r >> 1;       build(x << 1, l, mid);       build(x << 1 | 1, mid + 1, r);       up(x);     }     int query(int x, int l, int r, int L, int R) {       if (l > R || L > r) return 0x3f3f3f3f;       if (L <= l && r <= R) return Min[x];       int mid = l + r >> 1;       return min(query(x << 1, l, mid, L, R),                  query(x << 1 | 1, mid + 1, r, L, R));     }   } seg;   int SUM;   int n, N;   bool check(int x) {     int Min = seg.query(1, 1, N, x, x + n - 1);     int begin = sum[x - 1];     if (SUM < 0) {       begin += SUM;     }     if (Min >= begin)       return 1;     else       return 0;   }   int main() {     scanf( %s , ch + 1);     n = strlen(ch + 1);     for (int i = n + 1; i <= 2 * n; i++) {       if (ch[i - n] ==  ( )         ch[i - n] =  0 ;       else         ch[i - n] =  1 ;       ch[i] = ch[i - n];     }     N = n << 1;     Suffix_Array::GetSa(ch, N);     for (int i = 1; i <= N; i++) {       sum[i] = sum[i - 1];       if (ch[i] ==  0 )         sum[i]++;       else         sum[i]--;     }     SUM = sum[n];     seg.build(1, 1, N);     for (int i = 1; i <= N; i++) {       int x = Suffix_Array::sa[i];       if (x > n) continue;       if (check(x)) {         if (SUM < 0) {           for (int j = 0; j > SUM; j--) {             printf( ( );           }         }         for (int j = x; j < x + n; j++) {           if (ch[j] ==  0 )             printf( ( );           else             printf( ) );         }         if (SUM > 0) {           for (int j = 0; j < SUM; j++) {             printf( ) );           }         }         puts(  );         return 0;       }     }     assert(0);     return 0;   }   