private static void subStringGenerator(Index index, Letter root) { index.value = root.ch; for (Letter successor : root.children) { if (successor != null) { Index subIndex = index.getElementOrCreate(successor.ch); long subSize = subIndex.size; subStringGenerator(subIndex, successor); index.size += subIndex.size - subSize; } } }
public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); PrintWriter printWriter = new PrintWriter(System.out); // reading dimensions StringTokenizer stk = new StringTokenizer(bufferedReader.readLine()); int N = Integer.parseInt(stk.nextToken()), Q = Integer.parseInt(stk.nextToken()); // reading given tree // and building the index char alphabet[] = new char[N]; Letter letters[] = new Letter[N]; bufferedReader.read(alphabet, 0, N); for (int i = 0; i < N; i++) { letters[i] = new Letter(alphabet[i]); } bufferedReader.readLine(); for (int i = 0; i < N - 1; i++) { stk = new StringTokenizer(bufferedReader.readLine()); Letter parent = letters[Integer.parseInt(stk.nextToken()) - 1]; int j = Integer.parseInt(stk.nextToken()); Letter child = letters[j - 1]; // uniting duplicate children by the way if (parent.children[child.ch - 97] == null) { parent.children[child.ch - 97] = child; } else { letters[j - 1] = parent.children[child.ch - 97]; } } // return value for K=1 index.value = ' '; // generate all possible sub-strings for (int i = 0; i < N - 1; i++) { Letter letter = letters[i]; if (!letter.visited) { letter.visited = true; Index subIndex = index.getElementOrCreate(letter.ch); long subSize = subIndex.size; subStringGenerator(subIndex, letter); index.size += subIndex.size - subSize; } } // printing total number of distinct substrings printWriter.println(index.size); // printing answers string by string char[] order = new char[26]; for (int i = 0; i < Q; i++) { bufferedReader.read(order, 0, 26); int K = Integer.parseInt(bufferedReader.readLine().substring(1)); if (K > index.size) { printWriter.println("-1"); continue; } String stepAnswer = getString(index, order, K); printWriter.println(stepAnswer); } printWriter.flush(); }