模板:
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 const int INF=0x3f3f3f3f; 8 const int maxn=1000000+10; 9 int n;10 int trie[maxn][26], tot=1;11 bool end[maxn];12 13 void insert(char *str) {14 int len=strlen(str), p=1;15 for (int i=0; i
坑:不能只做结尾标记,要记录个数。
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 const int INF=0x3f3f3f3f; 8 const int maxn=1000000+10; 9 const int maxm=26*1000000+10;10 int n, m;11 int trie[maxn][26], tot=1;12 int endd[maxm];13 14 void insert(char *str) {15 int len=strlen(str), p=1;16 for (int i=0; i
把每个数转化为32位二进制整数,插入到Trie中,然后对于每个数贪心的选择与当前位相反的位。
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 const int INF=0x3f3f3f3f; 8 const int maxn=40; 9 const int maxm=100000+10;10 int n;11 int trie[maxn*maxm][2], tot=1;12 13 void insert(int x) {14 int p=1;15 for (int i=31; i>=0; --i) {16 int c=(x>>i)&1;17 if (trie[p][c]==0) trie[p][c]=++tot;18 p=trie[p][c];19 }20 }21 22 int search(int x) {23 //printf("%d:\n", x);24 int p=1, ans=0;25 for (int i=31; i>=0; --i) {26 int c=(x>>i)&1;27 if (trie[p][c^1]) {28 p=trie[p][c^1];29 ans=(ans<<1)|1;30 }31 else {32 p=trie[p][c];33 ans=ans<<1;34 }35 //printf("%d ", ans);36 }37 return ans;38 }39 40 int main() {41 //freopen("a.txt", "r", stdin);42 //freopen("a.out", "w", stdout);43 scanf("%d", &n);44 int x, ans=-INF;45 for (int i=1; i<=n; ++i) {46 scanf("%d", &x);47 ans=max(ans, search(x));48 //printf("\n");49 insert(x);50 } 51 printf("%d\n", ans);52 return 0;53 }