#include<iostream>
#include<string>
using namespace std;

//指定する値の位置を返す関数 -> 上底を求めることが出来る
int find( int* d, int a1, int a2, int b )           //配列d, 引数1 a1, 引数2, a2, 探す値 b
{
    for( int i = a1; i <= a2; i++ )
        if( d[i] == b )
            return i;
    return -1;                                      //見つからない場合-1を返す
}

//最小値を求める関数
int min( int* d, int a1, int a2 )
{
    int m = d[a1];
    for( int i = a1; i <= a2; i++ )
    {
        if( m > d[i] )
            m = d[i];
    }
    return m;
}

//面積を求める関数
int CalcArea( int* d, int v1, int v2, int a1, int a2 )
{
    int s = 0;

    for( int i = a1; i <= a2; i++ )
    {
        if( d[i] == v1 )
        {
            int place = find( d, i, a2, v2 );
            int top = place - i + 1;
            s += ( top + top - 2 ) * 1 / 2;
            i = place;
        }
    }

    return s;
}

int main()
{
    string str;
                                  
    int area = 0;                                   //面積
    int dia[20001] = {};                            //diagram
    int sub_area[3000] = {};                        //池それぞれの面積を格納
    int cnt = 0;                                    //入力文字の数
    int pond_cnt = 0;                               //池の数

    cin >> str;

    for( int i = 1; i <= str.size(); i++ )                 //入力。
    {
        if( str[i-1] == '\\' )                             // '\'は-1
            dia[i] = dia[i-1] - 1;
        else if( str[i-1] == '/' )                         // '/'は1
            dia[i] = dia[i-1] + 1;
        else if( str[i-1] == '_' )                         // '_'はその前の要素の値を入れる
            dia[i] = dia[i-1];
        else;
        cnt++;
    }

    //cout << "cnt: " << cnt;
    //cout << endl;

    //for( int i = 0; i < cnt; i++ )
      //  cout << dia[i] << " ";
    //cout << endl;

    for( int i = 0; i < cnt; i++ )
    {
        if( dia[i] - dia[i+1] == 1 )
        {
            int place = find( dia, i+1, cnt, dia[i] );
            if( place == -1 );                                      //見つからなかった → 水たまりが作れない
            else                                                    //水たまりが見つかれば
            {
                int mini = min( dia, i, place );                    //最小値
                for( int j = mini; j < dia[place]; j++ )
                {
                    area += CalcArea( dia, j, j+1, i+1, place );    //面積の計算
                }
                i = place - 1;                                      //次の池の計算に移る
                pond_cnt++;                                         //池の数を増やす
                sub_area[pond_cnt] = area;                          //池の面積を格納
                area = 0;                                           //面積初期化で、次の池の面積を新たに計算できるようにする
            }
        }
    }

    for( int i = 1; i < pond_cnt + 1; i++ )                         //総面積の計算
        area += sub_area[i];

    cout << area << endl;                                           //総面積の出力

    if( area != 0 )
        cout << pond_cnt << " ";                                    //池の数を出力
    else
        cout << pond_cnt << endl;

    for( int i = 1; i < pond_cnt; i++ )                             //部分面積の出力
        cout << sub_area[i] << " ";
    if( area != 0 )                                                 //presentationエラー処理
        cout << sub_area[pond_cnt] << endl;


    return 0;
}


Measured memory_bytes: 3332