Example #1
0
  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;
      }
    }
  }
Example #2
0
  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();
  }