func_code_string: #include <bits/stdc++.h>   using namespace std;   const int INF = INT_MAX;   const double EPS = 1e-10;   inline double SQR(double x) { return x * x; }   inline long long SQR(long long x) { return x * x; }   inline int SQR(int x) { return x * x; }   inline double SQR3(double x) { return x * x * x; }   inline void DEBUG() { puts( jackie ); }   inline bool zero(double x) { return abs(x) < EPS; }   inline int inInt() {     int x = 0, c;     while ((unsigned int)((c = getchar()) -  0 ) >= 10) {       if ( -  == c) return -inInt();     }     do {       x = (x << 3) + (x << 1) + (c -  0 );     } while ((unsigned int)((c = getchar()) -  0 ) < 10);     return x;   }   inline void outInt(int x) {     if (x < 0) {       putchar( - );       x = -x;     }     if (x >= 10) outInt(x / 10);     putchar((x % 10) +  0 );   }   const int MAXN = 1100000;   char a[MAXN], b[MAXN];   int len;   int dpa[MAXN], dpb[MAXN];   int DPb(int s);   int DPa(int s) {     if (-1 != dpa[s]) {       return dpa[s];     }     if (s == len) return 0;     int ans = 0;     switch (a[s]) {       case 0: {         ans = min(DPa(s + 1), 1 + DPb(s + 1));         break;       }       case 1: {         ans = DPa(s + 1) + 1;         break;       }     }     dpa[s] = ans;     return ans;   }   int DPb(int s) {     if (-1 != dpb[s]) return dpb[s];     if (s == len) return 0;     int ans;     switch (b[s]) {       case 0: {         ans = min(DPa(s + 1) + 1, DPb(s + 1));         break;       }       case 1: {         ans = DPb(s + 1) + 1;         break;       }     }     dpb[s] = ans;     return dpb[s];   }   int main() {     a[0] =  0 ;     gets(a + 1);     len = strlen(a);     for (int i = 0; i < len; i++) a[i] -=  0 ;     for (int i = 0; i < len; i++) b[i] = 1 - a[i];     b[len - 1]++;     int x = len - 1;     while (b[x] > 1) {       b[x] = 0;       b[x - 1]++;       x--;     }     memset(dpa, -1, sizeof(dpa));     memset(dpb, -1, sizeof(dpb));     int ans = DPa(0);     printf( %d n , ans);     int s = 0;     int flag = 0;     while (s < len) {       switch (flag) {         case 0: {           switch (a[s]) {             case 0: {               if (DPa(s + 1) != DPa(s)) {                 flag = 1 - flag;                 printf( +2^%d n , len - s - 1);               }               break;             }             case 1: {               printf( +2^%d n , len - s - 1);               break;             }           }           break;         }         case 1: {           switch (b[s]) {             case 0: {               if (DPb(s + 1) != DPb(s)) {                 flag = 1 - flag;                 printf( -2^%d n , len - 1 - s);               }               break;             }             case 1: {               printf( -2^%d n , len - 1 - s);               break;             }           }           break;         }       }       s++;     }     return 0;   }   