func_code_string: #include <bits/stdc++.h>   using namespace std;   const int NMax = 2000010;   char A[NMax];   int N, can[NMax], H[NMax], min1[NMax], min2[NMax], H1[NMax];   int main() {     scanf( %s , A);     N = strlen(A);     int last = 0;     for (int i = 0; i < N; i++) A[N + i] = A[i];     for (int i = 0; i < N; i++) {       if (A[i] ==  ( )         H[i] = last + 1;       else         H[i] = last - 1;       last = H[i];     }     min1[0] = H[0];     for (int i = 1; i < N; i++) min1[i] = min(min1[i - 1], H[i]);     min2[N - 1] = H[N - 1];     for (int i = N - 2; i >= 0; i--) min2[i] = min(min2[i + 1], H[i]);     for (int i = 0; i < N; i++)       if (A[i] ==  ( ) {         int flag = 1;         int delta = -1;         if (A[i] ==  ( ) delta = 1;         if (min2[i] - H[i] + delta < 0) flag = 0;         if (i > 0 && min1[i - 1] + H[N - 1] - H[i] + delta < 0) flag = 0;         if (H[N - 1] > 0) can[i] = flag;       }     for (int i = 0; i < N; i++)       if (H[N - 1] == 0) can[i] = 1;     last = 0;     for (int i = N - 1; i >= 0; i--) {       if (A[i] ==  ) )         H1[N - i - 1] = last + 1;       else         H1[N - i - 1] = last - 1;       last = H1[N - i - 1];     }     min1[0] = H1[0];     for (int i = 1; i < N; i++) min1[i] = min(min1[i - 1], H1[i]);     min2[N - 1] = H1[N - 1];     for (int i = N - 2; i >= 0; i--) min2[i] = min(min2[i + 1], H1[i]);     for (int i = 0; i < N; i++)       if (A[N - i - 1] ==  ) ) {         int flag = 1;         int delta = -1;         if (A[N - i - 1] ==  ) ) delta = 1;         if (min2[i] - H1[i] + delta < 0) flag = 0;         if (i > 0 && min1[i - 1] + H1[N - 1] - H1[i] + delta < 0) flag = 0;         if (H[N - 1] < 0) can[(N - (i - 1 + N) % N - 1 + N) % N] = flag;       }     for (int i = 0; i < N; i++) can[i + N] = can[i];     int p1 = 0, p2 = 1, pos = -1;     while (p1 < 2 * N && !can[p1]) p1 = p1 + 1;     p2 = p1 + 1;     while (p2 < 2 * N && !can[p2]) p2 = p2 + 1;     while (p1 < N && p2 < N) {       if (A[p2] > A[p1]) {         p2 = p2 + 1;         while (p2 < 2 * N && !can[p2]) p2 = p2 + 1;       } else if (A[p2] < A[p1]) {         p1 = p2;         p2 = p2 + 1;         while (p2 < 2 * N && !can[p2]) p2 = p2 + 1;       } else {         int k = 1;         while (k < 2 * N && A[p1 + k] == A[p2 + k]) k++;         if (A[p1 + k] > A[p2 + k]) {           p1 = p1 + k + 1;           while (p1 < 2 * N && !can[p1]) p1 = p1 + 1;         } else {           p2 = p2 + k + 1;           while (p2 < 2 * N && !can[p2]) p2 = p2 + 1;         }       }       if (p1 == p2) {         p2 = p1 + 1;         while (p2 < 2 * N && !can[p2]) p2 = p2 + 1;       } else if (p1 > p2)         swap(p1, p2);     }     pos = p2;     if (p1 < p2) pos = p1;     if (pos >= N) pos -= N;     if (H[N - 1] > 0) {       printf( %c , A[pos]);       for (int i = (pos + 1) % N; i != pos; i = (i + 1) % N) printf( %c , A[i]);       while (H[N - 1]--) printf( ) );     } else {       while (H[N - 1]++) printf( ( );       printf( %c , A[pos]);       for (int i = (pos + 1) % N; i != pos; i = (i + 1) % N) printf( %c , A[i]);     }     puts(  );     getchar();     getchar();     return 0;   }   