Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Areas on the Cross-Section Diagram

Your task is to simulate a flood damage.

For a given cross-section diagram, reports areas of flooded sections.

Assume that rain is falling endlessly in the region and the water overflowing from the region is falling in the sea at the both sides.
For example, for the above cross-section diagram, the rain will create floods which have areas of 4, 2, 1, 19 and 9 respectively.

Input

A string, which represents slopes and flatlands by '/', '\' and '_' respectively, is given in a line. For example, the region of the above example is given by a string "\\///\_/\/\\\\/_/\\///__\\\_\\/_\/_/\".

output

Report the areas of floods in the following format:

$A$

$k$ $L_1$ $L_2$ ... $L_k$

In the first line, print the total area $A$ of created floods.

In the second line, print the number of floods $k$ and areas $L_i (i = 1, 2, ..., k)$ for each flood from the left side of the cross-section diagram. Print a space character before $L_i$.

Constraints

$1 \leq$ length of the string $\leq 20,000$

Sample Input 1

\\//

Sample Output 1

4
1 4

Sample Input 2

\\///\_/\/\\\\/_/\\///__\\\_\\/_\/_/\

Sample Output 2

35
5 4 2 1 19 9

Solution in C (judge verdict: Accepted)

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

#define MAX_NUM_OF_ARRAY 20001

/**
 *  @brief inputの配列から高さの配列を取得する
 *
 *  @param [in]  inputArray  inputの配列
 *  @param [out] heightArray 高さの配列
 */
void makeHeightArray(const char* inputArray,
                     int* heightArray)
{
    int i;
    int addNum;
    
    for(i=1; i<MAX_NUM_OF_ARRAY; i++){
        if(inputArray[i-1] == '\\' ){
            addNum = -1;
        }else if(inputArray[i-1] == '/' ){
            addNum = 1;
        }else if(inputArray[i-1] == '_' ){
            addNum = 0;
        }else{
            break;
        }
        heightArray[i] = heightArray[i-1] + addNum;
    }
    return;
}

/**
 *  @brief inputと高さの配列から水たまりの左端、右端の配列と水たまりの数を取得
 *
 *  @param [in]  inputArray  inputの配列
 *  @param [in]  heightArray 高さの配列
 *  @param [out] edgeArray   水たまりの左端、右端の配列
 *  @param [in]  inputNum    inputの配列の要素数
 *
 *  @return 水たまりの数
 */
int calculatePoolInfo(const char* inputArray,
                      const int* heightArray,
                      int* edgeArray,
                      const int inputNum)
{
    int i;
    int j;
    int k = 0;
    int poolNum = 0;
    int searchStart = 0;
    
    for(i=0; i<inputNum; i++){
        /* 水たまりの左端検索 */
        if(inputArray[i] == '\\'){
            /* 下り坂であれば水たまりの左端の可能性があるので次のfor文へ */
        }else{
            continue;
        }
        /* 左端が見つかったら水たまりの検索は次の'/'の位置からとする */
        if(searchStart == 0){
            for(j=i+1; j<inputNum; j++){
                if(inputArray[j] == '/'){
                    searchStart = j;
                    break;
                }
                /* '/'を検索して最後まできたということは水たまりは無いという事 */
                if(j == inputNum-1){
                    return poolNum;
                }
            }
        }
        for(j=searchStart; j<inputNum; j++){
            /* 左端と同じ高さの水たまりの右端検索 */
            if(heightArray[i] == heightArray[j]){
                poolNum++;          /* 同じ高さがあるという事は水たまりがあるという事 */
                edgeArray[k] = i;   /* 水たまりの左端の位置取得 */
                edgeArray[k+1] = j; /* 水たまりの右端の位置取得 */
                k += 2;
                i = j-1; /* 今回の水たまりの右端が次の水たまりの左端になる可能性がある
                            上のfor文に戻ると+1されるのでここで-1しておく */
                searchStart = 0;
                break;
            }
            /* j = inputNum-1 まで来たら同じ高さに水たまりは無かったという事 */
        }
    }
    
    return poolNum;
}

/**
 *  @brief 高さと水たまりの左端、右端配列から水たまりの面積の配列を取得
 *
 *  @param [in]  heightArray 高さの配列
 *  @param [in]  edgeArray   水たまりの左端、右端の配列
 *  @param [out] areaArray   水たまりの面積の配列
 *  @param [in]  poolNum     水たまりの数
 */
void calculatePoolArea(const int* heightArray,
                       const int* edgeArray,
                       int* areaArray,
                       const int poolNum)
{
    int i;
    int j;
    int area;
    int startNum;
    int endNum;
    
    for(i=0; i<poolNum; i++){
        startNum = edgeArray[i*2];
        endNum = edgeArray[i*2+1];
        areaArray[i] = 0;
        for(j=startNum+1; j<endNum; j++){
            areaArray[i] += (heightArray[startNum] - heightArray[j]);
        }
    }
}

int main()
{
    int poolNum;    /* 水たまりの数 */
    int inputNum;   /* input配列の要素数 */
    int sumOfArea;  /* 全ての面積の合計 */
    int i = 0;
    int c;          /* getcharからの受け取り用変数 */
    
    static char inputArray[MAX_NUM_OF_ARRAY];
    int *heightArray;
    int *edgeArray;
    int *areaArray;
    
    inputNum = 1; /* 個数なので1から */
    do{
        c = getchar();
        if((c == '\\') || (c == '/') || (c == '_')){
            inputArray[i] = c;
            inputNum++;
            i++;
        }else{
            break;
        }
        /* inputの個数チェック */
        if(i>=MAX_NUM_OF_ARRAY){
            printf("inputの配列が20000を超えています\n");
            return -1;
        }
    } while(1);
    
    heightArray = (int *)malloc(sizeof(int)*inputNum);
    if(heightArray == NULL) {
      printf("heightArrayのメモリが確保できません\n");
      return -1;
    }
    edgeArray = (int *)malloc(sizeof(int)*inputNum);
    if(edgeArray == NULL) {
      printf("edgeArrayのメモリが確保できません\n");
      return -1;
    }
    
    makeHeightArray(inputArray, heightArray);
    
    poolNum = calculatePoolInfo(inputArray, heightArray, edgeArray, inputNum);
    
    areaArray = (int *)malloc(sizeof(int)*poolNum);
    if(areaArray == NULL) {
      printf("areaArrayのメモリが確保できません\n");
      return -1;
    }
    
    calculatePoolArea(heightArray, edgeArray, areaArray, poolNum);
    
    /* 結果表示 */
    sumOfArea = 0;
    for(i=0; i<poolNum; i++){
        sumOfArea += areaArray[i];
    }
    printf("%d\n", sumOfArea);
    
    printf("%d", poolNum);
    
    for(i=0; i<poolNum; i++){
        printf(" %d", areaArray[i]);
    }
    printf("\n");
    /* メモリの解放 */
    free(heightArray);
    free(edgeArray);
    free(areaArray);
    
    return 0;
}