标签:+= code name ack 更改 异或运算 tput main str
在给定的 N 个整数 A1,A2,…,AN 中选出两个进行异或运算,得到的结果最大是多少?
Input
第一行一个整数 N。
第二行 N 个整数 Ai。
Output
一个整数表示答案。
Example
样例输入
5
2 9 5 7 0
样例输出
14
Hint
对于 100%100% 的数据,1≤N≤105,0≤Ai<231。
01Trie,把每个数转化成32位的二进制串,insert函数不变,search函数里查找的时候优先沿着与带查找字符串当前位相反的字符指针向下访问,如果p为空的话就只能退而求其次访问与当前位相同的字符指针。
两个小坑:trie数组第一维一定要开的足够大,search函数里每一重循环记得保留原始的p(便于处理为空的情况)。
#include <bits/stdc++.h> using namespace std; int n,trie[100005*31][2],tot=1,ans=0; vector<string>v; int fpow(int a,int b) { int ans=1; for(;b;b>>=1) { if(b&1) ans=ans*a; a=a*a; } return ans; } string tran(int num) { string s; int i; for(i=0;i<32;i++) { if(num&(1<<i)) s="1"+s; else s="0"+s; } return s; } void insert(string s) { int p=1,k; for(k=0;k<32;k++) { int ch=s[k]-‘0‘; if(trie[p][ch]==0) trie[p][ch]=++tot; p=trie[p][ch]; } } int search(string s)//返回最大的异或值 { int k,p=1,num=0; for(k=0;k<32;k++) { int orip=p; p=trie[p][1-(s[k]-‘0‘)];//防止p被更改 if(p==0) { p=trie[orip][s[k]-‘0‘];//退而求其次 } else { num+=fpow(2,32-k-1); } } return num; } int main() { cin>>n; int i; for(i=1;i<=n;i++) { int temp; scanf("%d",&temp); string ss=tran(temp); insert(ss); v.push_back(ss); } for(i=0;i<v.size();i++) { ans=max(ans,search(v[i])); } cout<<ans<<endl; return 0; }
标签:+= code name ack 更改 异或运算 tput main str
原文地址:https://www.cnblogs.com/lipoicyclic/p/13030342.html