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)

using System;

// i should implement by Generic Type
public class Stack {
  private int[] stack = new int[1000000];
  private int pos = 0;
  
  public void Push(int x) {
    stack[pos++] = x;
  }

  public int Pop() {
    return stack[--pos];
  }

  public int Top() {
    return stack[pos-1];
  }

  public int Count {
    get {
      return pos;
    }
  }

  public void Print(string sep = " ") {
    if (Count <= 0) return;
    for (int i = pos-1; i > 0; i--) {
      Console.Write(stack[i] + sep);
    }
    Console.WriteLine(stack[0]);
  }

  public void PrintReverse(string sep = " ") {
    if (Count <= 0) return;
    for (int i = 0; i < pos-1; i++) {
      Console.Write(stack[i] + sep);
    }
    Console.WriteLine(stack[pos-1]);
  }
}

public class Solve {
  public static void Main() {
    // define section
    Stack bsPos = new Stack(); // store positions of back slash  
    Stack fldArea = new Stack(); // store areas of each flood
    Stack fldPos = new Stack(); // store positions of each flood's top left
    // note:  fldArea[i] and fldPos[i] have very strong relations.
    //        the order is important, don't sort.
    string line = Console.ReadLine();
    char c;
    int area, pos;
    int ans = 0;
   
    // calculate section 
    for (int i = 0; i < line.Length; i++) {
      c = line[i];
      if (c == '\\') {
        bsPos.Push(i);
      } else if (c == '/') {
        if (bsPos.Count > 0) {
          pos = bsPos.Pop();
          area = i - pos;
          ans += area;
          while (fldPos.Count > 0 && fldPos.Top() >= pos) {
            area += fldArea.Pop();
            fldPos.Pop();  
          }
          fldArea.Push(area);
          fldPos.Push(pos);
        }
      }
      //fldArea.Print();
    }

    // print section
    Console.WriteLine(ans);
    Console.Write(fldArea.Count);
    //fldArea.Print();
    if (fldArea.Count > 0) {
      Console.Write(" ");
      fldArea.PrintReverse();
    } else {
      Console.WriteLine();
    }
  }
}