Третий день уже бьюсь! Вроде придумал простое, лаконичное решение и вроде как оно отрабатывает правильно, но валидатор завершается по timeout. Порядком подустал от этой задачи - подскажите что не так пожалуйста. Условие довольно длинное, так что смотрите в самой задаче: Условие тут.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Solution {
    public static Map<Integer, Integer> map = new HashMap<>();
    //public static String tag = "span";
    public static String tag;

    public static void main(String[] args) {
        tag = args[0];
        BufferedReader reader;
        StringBuilder sb = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            reader = new BufferedReader(new FileReader(br.readLine()));
            while (reader.ready()) {
                sb.append(reader.readLine());
            }

            String str = sb.toString();
/*            System.out.println(str);
            System.out.println("*************************");*/

            tearOff(str);

            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void tearOff(String string) {
        int stack = 1, index = 0;
        if (string.contains("<" + tag)) {

            while (index < string.length()) {

                index = string.indexOf(tag, index);

                if (string.charAt(index - 1) == '<') {
                    index -= 1;
                    map.put(stack, index);
                    stack++;
                    index += 2;
                } else if (string.charAt(index - 1) == '/') {
                    index += 5;
                    stack--;
                    map.put(0 - stack, index);
                    index++;
                }

                if (stack == 1) {
                    for (Map.Entry entry : map.entrySet()) {
                        int x = (int) entry.getKey();
                        if (x > 0) {
                            System.out.println(string.substring((int) entry.getValue(), map.get(0 - x)));
                        }
                    }
                    map.clear();
                }

            }

        }
    }
}