func_code_string: #include <bits/stdc++.h>   using namespace std;   const int BIG = 1000200;   char buf[BIG];   int skip0[BIG], skip1[BIG];   int vpre[BIG];   struct E {     int to;     char sign;     int pw;   };   vector<E> vg[BIG];   int main() {     while (scanf(  %s , buf) != EOF) {       string s(buf);       s =  00  + s;       int N = (int)((s).size());       int prev0 = 0, prev1 = 0;       memset((skip0), (-1), sizeof(skip0));       memset((skip1), (-1), sizeof(skip1));       for (int i = 0; i < (int)(N); ++i) {         skip0[i] = prev0;         skip1[i] = prev1;         if (s[i] ==  0 ) {           prev0 = i;         }         if (s[i] ==  1 ) {           prev1 = i;         }       }       for (int i = 0; i < (int)(BIG); ++i) vg[i].clear();       for (int i = 0; i < (int)(N); ++i) {         if (i == 0) continue;         vg[i].push_back((E){skip1[i],  + , N - 1 - i});         vg[i].push_back((E){skip0[i],  - , N - 1 - i});       }       int start = -1;       for (int i = 0; i < (int)(N); ++i)         if (s[N - 1 - i] ==  1 ) {           start = N - 1 - i;           break;         }       assert(start >= 0);       queue<pair<int, int> > q;       memset((vpre), (-1), sizeof(vpre));       q.push(make_pair(start, -2));       while (!q.empty()) {         int curr = q.front().first;         int prev = q.front().second;         q.pop();         if (vpre[curr] != -1) continue;         vpre[curr] = prev;         if (curr == 0) break;         for (__typeof((vg[curr]).begin()) e = (vg[curr]).begin();              e != (vg[curr]).end(); ++e) {           q.push(make_pair(e->to, curr));         }       }       assert(vpre[0] >= 0);       vector<E> outp;       for (int curr = 0; curr >= 0; curr = vpre[curr]) {         int prev = vpre[curr];         for (__typeof((vg[prev]).begin()) e = (vg[prev]).begin();              e != (vg[prev]).end(); ++e) {           if (e->to == curr) {             outp.push_back(*e);             break;           }         }       }       printf( %d n , (int)((outp).size()));       for (int i = 0; i < (int)((int)((outp).size())); ++i)         printf( %c2^%d n , outp[i].sign, outp[i].pw);     }   }   