func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T>   inline T bigmod(T p, T e, T M) {     long long int ret = 1;     for (; e > 0; e >>= 1) {       if (e & 1) ret = (ret * p) % M;       p = (p * p) % M;     }     return (T)ret;   }   template <class T>   inline T gcd(T a, T b) {     if (b == 0) return a;     return gcd(b, a % b);   }   template <class T>   inline T modinverse(T a, T M) {     return bigmod(a, M - 2, M);   }   template <class T>   inline T bpow(T p, T e) {     long long int ret = 1;     for (; e > 0; e >>= 1) {       if (e & 1) ret = (ret * p);       p = (p * p);     }     return (T)ret;   }   int toInt(string s) {     int sm;     stringstream ss(s);     ss >> sm;     return sm;   }   int toLlint(string s) {     long long int sm;     stringstream ss(s);     ss >> sm;     return sm;   }   int ts, kk = 1;   int n, a[1000006];   bool bl[1000006];   char s[1000006];   int p[2][2][1000006];   int dp(bool st, bool c, int i) {     if (i == n) {       if (c && st) return -1;       return 0;     }     int &pr = p[st][c][i];     if (pr != -1) return pr;     pr = 0;     pr = max(pr, dp(st, 0, i + 1));     if (bl[i] == 0) {       if (c == 0) pr = max(dp((i == 0) || st, 1, i + 1) + 1, pr);       if (a[i] > 1) pr = max(dp(st, 1, i + 1) + 1, pr);     } else {       if (c == 0) pr = max(dp((i == 0) || st, 1, i + 1) + 1, pr);       if (a[i] > 1) pr = max(dp(st, 1, i + 1) + 1, pr);     }     return pr;   }   void prnt(bool st, bool c, int i) {     if (i == n) {       puts(  );       return;     }     int &pr = p[st][c][i];     if (dp(st, 0, i + 1) == pr) {       prnt(st, 0, i + 1);       return;     }     if (bl[i] == 0) {       if (c == 0 && dp((i == 0), 1, i + 1) + 1 == pr) {         printf( %d 0 0 n , i);         prnt((i == 0), 1, i + 1);         return;       }       if (a[i] > 1 && pr == dp(st, 1, i + 1) + 1) {         printf( %d 0 1 n , i);         prnt(st, 1, i + 1);         return;       }     } else {       if (c == 0 && dp((i == 0), 1, i + 1) + 1 == pr) {         printf( %d 1 0 n , i);         prnt((i == 0), 1, i + 1);         return;       }       if (a[i] > 1 && pr == dp(st, 1, i + 1) + 1) {         printf( %d 1 1 n , i);         prnt(st, 1, i + 1);         return;       }     }   }   int main() {     int t, i, j, k;     memset(p, -1, sizeof(p));     scanf(  %s , s);     k = strlen(s);     bl[0] = s[0] -  0 ;     n = 1;     for (i = 0; i < k; i++) {       if ((bool)(s[i] -  0 ) == bl[n - 1])         a[n - 1]++;       else {         bl[n] = (s[i] -  0 );         a[n++] = 1;       }     }     if (n > 1 && bl[n - 1] == bl[0]) {       a[0] += a[n - 1];       n--;     }     k = dp(0, 0, 0);     printf( %d n , k);     return 0;   }   