http://acm.pku.edu.cn/JudgeOnline/problem?id=1223
Код:
import java.util.*; public class Main { static Tree tree; static String[] s; static String[] res; static char[] cs, ds; static int num, size; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); sc.nextLine(); for (int k = 1; k <= t; k++) { System.out.printf("DATASET #%d%n", k); tree = new Tree(""); size = 1; tree.add(); s = new String[27]; cs = sc.nextLine().toCharArray(); ds = sc.nextLine().toCharArray(); boolean[] b = new boolean[27]; num = 0; for (char c : cs) { int id = f(c); if (!b[id]) num++; b[id] = true; } if (search(0, 0, 0) != 1) System.out.println("MULTIPLE TABLES"); else { for (int i = 0; i < 27; i++) { if (res[i] != null) System.out.println(g(i) + " = " + res[i]); } } } } static int f(char c) { if (c == ' ') return 0; return c - 'A' + 1; } static char g(int i) { if (i == 0) return ' '; return (char)('A' + i - 1); } static int search(int p, int q, int r) { if (p == cs.length) { if (q == ds.length && num == size && r++ == 0) res = s.clone(); return r; } if (q >= ds.length) return r; int id = f(cs[p]); if (s[id] != null) { if (q + s[id].length() > ds.length) return r; for (int i = 0; i < s[id].length(); i++) { if (ds[q + i] != s[id].charAt(i)) return r; } return search(p + 1, q + s[id].length(), r); } Stack<Tree> st = new Stack<Tree>(); Tree t = tree.child[ds[q] - '0']; for (int i = q; !t.has; i++) { if (t.end) { s[id] = t.s; t.has = true; r = search(p + 1, i + 1, r); if (r > 1) return r; t.has = false; s[id] = null; if (size >= num) break; st.add(t); t.add(); } if (i + 1 >= ds.length) break; t = t.child[ds[i + 1] - '0']; } for (Tree tr : st) { tr.remove(); } return r; } static class Tree { String s; Tree[] child; boolean end, has; Tree(String s) { this.s = s; end = true; } void add() { size++; if (child == null) child = new Tree[]{new Tree(s + "0"), new Tree(s + "1")}; end = false; } void remove() { size--; end = true; } } }