1 /************************************************************************* 2 3 题目: Claris and XOR(hdu 5661) 4 链接: http://acm.hdu.edu.cn/showproblem.php?pid=5661 5 算法: 数位dp 6 题意: 给出a,b,c,d四个数a<=b,c<=d,找出 a<=x<=b,c<=y<=d; 7 使得x^y最大。输出最大值。 8 解法: 把每个数看成2进制,从大到下一位一位判断是否能为1。 9 10 *************************************************************************/ 11 12 #include<iostream> 13 #include<cstring> 14 #include<algorithm> 15 #include<cmath> 16 #include<cstdio> 17 using namespace std; 18 19 long long a,b,c,d,ans; 20 void dfs(long long x,long long y,long long k) 21 { 22 if (k<0) return ; 23 long long cut=pow(2,k); 24 long long rx=x+cut; 25 long long ry=y+cut; 26 if (rx<=b&&c-ry<0) 27 { 28 ans+=cut; 29 dfs(rx,y,k-1); 30 return ; 31 } 32 if (ry<=d&&a-rx<0) 33 { 34 ans+=cut; 35 dfs(x,ry,k-1); 36 return ; 37 } 38 if (rx<=b&&ry<=d) 39 { 40 dfs(rx,ry,k-1); 41 } 42 else dfs(x,y,k-1); 43 return ; 44 } 45 46 int main() 47 { 48 int t,n; 49 scanf("%d",&t); 50 while (t--) 51 { 52 long long q; 53 ans=0; 54 scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&d); 55 q=max(b,d); 56 for (n=0;q;n++) q/=2; ///找最大数有几位2进制。 57 dfs(0,0,n-1); 58 printf("%I64d\n",ans); 59 } 60 }