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 }

 

posted on 2016-04-12 13:04  pb2016  阅读(313)  评论(0编辑  收藏  举报