没有路就新建节点:已经有路就复用节点
p值就是以他开头的有多少个
e值就是这个字符串出现了几次
题目一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import java.util.HashSet;
public class Code02_TwoNumbersMaximumXor {
public static int findMaximumXOR1(int[] nums) { build(nums); int ans = 0; for (int num : nums) { ans = Math.max(ans, maxXor(num)); } clear(); return ans; }
public static int MAXN = 3000001;
public static int[][] tree = new int[MAXN][2];
public static int cnt;
public static int high;
public static void build(int[] nums) { cnt = 1; int max = Integer.MIN_VALUE; for (int num : nums) { max = Math.max(num, max); } high = 31 - Integer.numberOfLeadingZeros(max); for (int num : nums) { insert(num); } }
public static void insert(int num) { int cur = 1; for (int i = high, path; i >= 0; i--) { path = (num >> i) & 1; if (tree[cur][path] == 0) { tree[cur][path] = ++cnt; } cur = tree[cur][path]; } }
public static int maxXor(int num) { int ans = 0; int cur = 1; for (int i = high, status, want; i >= 0; i--) { status = (num >> i) & 1; want = status ^ 1; if (tree[cur][want] == 0) { want ^= 1; } ans |= (status ^ want) << i; cur = tree[cur][want]; } return ans; }
public static void clear() { for (int i = 1; i <= cnt; i++) { tree[i][0] = tree[i][1] = 0; } }
|