Codeforces #48 B "bHTML Tables Analisys"

問題:http://codeforces.com/contest/51/problem/B

参加形式:本番

各tableタグに含まれるセルの数を昇順で出力.

時間がなかったのでSAX使ってテキトーに実装.

import java.io.ByteArrayInputStream;
import java.util.*;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class B_bHTMLTablesAnalisys {
	public static void main(String[] args) throws Exception{
		StringBuilder str = new StringBuilder();
		for(Scanner s = new Scanner(System.in);s.hasNext();){
			str.append(s.next());
		}
		SAXParserFactory spf = SAXParserFactory.newInstance();
		SAXParser parser = spf.newSAXParser();
		Handler hd = new Handler();
		parser.parse(new ByteArrayInputStream(str.toString().replaceAll("\\s", "").getBytes()), hd);
		Collections.sort(hd.result);
		System.out.println(hd.result.toString().replaceAll("[\\[\\],]", ""));
	}

	static class Handler extends DefaultHandler {
		List<Integer> result = new ArrayList<Integer>();
		ArrayDeque<Integer> q = new ArrayDeque<Integer>();
		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if(qName.equals("table")){
				q.push(0);
			}else if(qName.endsWith("td")){
				q.push(q.poll()+1);
			}
		}
		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if(qName.equals("table")){
				result.add(q.poll());
			}
		}
	}
}