structtrie{ trie* next[2] = {nullptr, nullptr}; int x; //保存走到这个位置上的数的下标 }; trie* root; intfind(int t, int dx){ trie* cur = root; int x = 0, f = 0; for (int i = k-1;i >= 0;i--){ int bit = (t >> i & 1); if (cur->next[bit] == nullptr){ cur->next[bit] = newtrie(); f = 1; }else{ if (f == 0 || x == -1){ x = cur->next[bit]->x; } } cur->next[bit]->x = dx; cur = cur->next[bit]; } if (x == 0) x = 1; return x; } // 计算同或 intcal(int x, int y){ int res = 0; for (int i = k-1;i >= 0;i--){ int bit1 = (x >> i & 1); int bit2 = (y >> i & 1); res |= (bit1^bit2^1) << i; } return res; } voidsolve(){ cin >> n >> k; root = newtrie(); int ans = 0, x = 0, y = 0, z = 0; for (int i = 1;i <= n;i++){ int t = 0; cin >> t; a[i] = t; int res = find(t, i); int maxv = cal(t, a[res]); if (i > 1 && ans <= maxv){ ans = maxv; x = i, y = res; } } // 翻转二进制位 for (int i = k-1;i >= 0;i--){ int bit = (a[x] >> i & 1) ^ 1; z |= bit << i; } p(x);p(y);pl(z); }