#include <assert.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

#define BUF_SIZE (20000+1) //入力バッファサイズ（ヌル終端領域込み）
#define INVALID_AREA (-1) // 水たまりの面積の無効値

struct Stack{
    size_t capacity;
    size_t size;
    int* buf;
};

struct Stack* stack_new(size_t capacity)
{
    struct Stack* stack=malloc(sizeof(struct Stack));
    assert(stack);
    stack->buf=malloc(sizeof(int)*capacity);
    assert(stack->buf);
    stack->capacity=capacity;
    stack->size=0;
    return stack;
}

void stack_delete(struct Stack* stack)
{
    free(stack->buf);
    free(stack);
}

bool stack_empty(struct Stack* stack){
    return stack->size==0;
}

size_t stack_size(struct Stack* stack)
{
    return stack->size;
}

void stack_push(struct Stack* stack, int item)
{
    assert(stack->size<stack->capacity);
    stack->buf[stack->size]=item;
    ++stack->size;
}

int stack_pop(struct Stack* stack){
    assert(!stack_empty(stack));
    assert(stack->size<=stack->capacity);
    --stack->size;
    return stack->buf[stack->size];
}

void merge_area(struct Stack* area_stack)
{
    int accumerated_area=0;
    int area=stack_pop(area_stack);
    while(area!=INVALID_AREA){
        accumerated_area+=area;
        area=stack_pop(area_stack);
    }
    stack_push(area_stack, accumerated_area);
}

int main(void){
    char* buf=malloc(sizeof(char)*BUF_SIZE);
    assert(buf);
    fgets(buf, BUF_SIZE, stdin);

    size_t len=strlen(buf);
    struct Stack* index_stack=stack_new(len); // '/'に対応する'\'のインデックスを保持（台形面積の計算に使用）
    struct Stack* area_stack=stack_new(len); // 現在までにできた水たまり

    for(int i=0; i<len; ++i){
        if(buf[i]=='\\'){
            stack_push(index_stack, i);
            stack_push(area_stack, INVALID_AREA);
        } else if(buf[i]=='/'){
            if(stack_empty(index_stack)){
                // これまでの水たまりはこれからできる水たまりにはマージされない。マージを防ぐために無効値を置いておく
                stack_push(area_stack, INVALID_AREA);
            } else{
                int j=stack_pop(index_stack);
                int upper_len=i-j+1, lower_len=i-j-1;
                int area=(upper_len+lower_len)/2;
                stack_push(area_stack, area);
                merge_area(area_stack);
            }
        }
    }

    struct Stack* result_stack=stack_new(stack_size(area_stack));
    int sum_area=0;
    while(!stack_empty(area_stack)){
        int area=stack_pop(area_stack);
        if(area==INVALID_AREA){
            continue;
        }
        sum_area+=area;
        stack_push(result_stack, area);
    }

    printf("%d\n%ld", sum_area, stack_size(result_stack));
    while(!stack_empty(result_stack)){
        printf(" %d",stack_pop(result_stack));
    }
    printf("\n");

    stack_delete(result_stack);
    stack_delete(area_stack);
    stack_delete(index_stack);
    free(buf);

    return 0;
}

