Problem:
Hierarchical Democracy

The presidential election in Republic of Democratia is carried out through multiple stages as follows.

There are exactly two presidential candidates.

At the first stage, eligible voters go to the polls of his/her electoral district.
The winner of the district is the candidate who takes a majority of the votes.
Voters cast their ballots only at this first stage.

A district of the k-th stage (k > 1) consists of multiple districts of the (k − 1)-th stage. In contrast, a district of the (k − 1)-th stage is a sub-district of one and only one district of the k-th stage. The winner of a district of the k-th stage is the candidate who wins in a majority of its sub-districts of the (k − 1)-th stage.

The final stage has just one nation-wide district. The winner of the final stage is chosen as the president.

You can assume the following about the presidential election of this country.

Every eligible voter casts a vote.

The number of the eligible voters of each electoral district of the first stage is odd.

The number of the sub-districts of the (k − 1)-th stage that constitute a district of the k-th stage (k > 1) is also odd.

This means that each district of every stage has its winner (there is no tie).

Your mission is to write a program that finds a way to win the presidential election with the minimum number of votes.
Suppose, for instance, that the district of the final stage has three sub-districts of the first stage and that the numbers of the eligible voters of the sub-districts are 123, 4567, and 89, respectively.
The minimum number of votes required to be the winner is 107, that is, 62 from the first district and 45 from the third.
In this case, even if the other candidate were given all the 4567 votes in the second district, s/he would inevitably be the loser.
Although you might consider this election system unfair, you should accept it as a reality.

Input

The entire input looks like:

the number of datasets (=n)

1st dataset

2nd dataset

…

n-th dataset

The number of datasets, n, is no more than 100.

The number of the eligible voters of each district and the part-whole relations among districts are denoted as follows.

An electoral district of the first stage is denoted as [c], where c is the number of the eligible voters of the district.

A district of the k-th stage (k > 1) is denoted as [d1d2…dm], where d1, d2, …, dm denote its sub-districts of the (k − 1)-th stage in this notation.

For instance, an electoral district of the first stage that has 123 eligible voters is denoted as [123].
A district of the second stage consisting of three sub-districts of the first stage that have 123, 4567, and 89 eligible voters, respectively, is denoted as [[123][4567][89]].

Each dataset is a line that contains the character string denoting the district of the final stage in the aforementioned notation.
You can assume the following.

The character string in each dataset does not include any characters except digits ('0', '1', …, '9') and square brackets ('[', ']'), and its length is between 11 and 10000, inclusive.

The number of the eligible voters of each electoral district of the first stage is between 3 and 9999, inclusive.

The number of stages is a nation-wide constant.
So, for instance, [[[9][9][9]][9][9]] never appears in the input.
[[[[9]]]] may not appear either since each district of the second or later stage must have multiple sub-districts of the previous stage.

Output

For each dataset, print the minimum number of votes required to be the winner of the presidential election in a line.
No output line may include any characters except the digits with which the number is written.

Sample Input

6
[[123][4567][89]]
[[5][3][7][3][9]]
[[[99][59][63][85][51]][[1539][7995][467]][[51][57][79][99][3][91][59]]]
[[[37][95][31][77][15]][[43][5][5][5][85]][[71][3][51][89][29]][[57][95][5][69][31]][[99][59][65][73][31]]]
[[[[9][7][3]][[3][5][7]][[7][9][5]]][[[9][9][3]][[5][9][9]][[7][7][3]]][[[5][9][7]][[3][9][3]][[9][5][5]]]]
[[8231][3721][203][3271][8843]]

Output for the Sample Input

107
7
175
95
21
3599

Solution in JAVA (judge verdict: Accepted)



import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO ?????????????????????????????????????????????
		new Main().start();
	}
	void start(){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		for(int i= 0; i < n; i++){
			String s = in.next();
			Node node = null;
			Node parent = null;
			Node root = null;
			for(int j =0; j < s.length(); j++){
				switch(s.charAt(j)){
				case '[':
					node = new Node(parent);
					if(parent == null){
						parent = node;
						root = node;
					}else{
						parent.children.add(node);
						node.parent = parent;
						parent = node;
					}
					break;
				case ']':
					parent = node.parent;
					node =  node.parent;
					break;
				default:
					String ss = ""+s.charAt(j);
					j++;
					while(s.charAt(j) != ']'){
						ss += ""+s.charAt(j);
						j++;
					}
					j--;
					node.value = Integer.parseInt(ss);
					node.isLeaf = true;
				}
			}
			root.calcValue();
			System.out.println(root.value);
		}
		in.close();
	}
	Node getRoot(Node n){
		while(n.parent != null){
			n = n.parent;
		}
		return n;
	}
	class Node implements Comparable<Node>{
		Node parent;
		ArrayList<Node> children;
		int value;
		boolean isLeaf = false;
		Node(Node p){
			parent = p;
			children = new ArrayList<Node>();
			value = -1;
		}
		void calcValue(){
			if(!canCalc()){
				for(Node n : children){
					n.calcValue();
				}
			}
			Collections.sort(children);
//			System.out.println(children.size());
//			for(Node n : children){
//				System.out.print(n.value + " ");
//			}
//			System.out.println("");
			int a = 0;
			for(int i = 0; i < children.size()/2+1; i++){
				if(children.get(i).isLeaf){
					a += children.get(i).value/2+1;
				}else{
					a += children.get(i).value;
				}
			}
			value = a;
		}
		boolean canCalc(){
			for(Node n : children){
				if(n.value == -1) return false;
			}
			return true;
		}
		@Override
		public int compareTo(Node o) {
			// TODO ?????????????????????????????????????????????
			return this.value - o.value;
		}
	}

}