http://www.ifrog.cc/acm/problem/1028

很有趣的一道题,求从n个数里挑出不同的两个,使得他俩'|','&','^'后的值尽量大,求这个最大的结果。

求最大的异或值想到了trie树的一个经典操作,对于按位与,要两个位置都是1才会出现1,我们肯定要贪心操作,优先使高位为1,

这也可以在trie上完成,如果这个位置1的个数>=2,至少有两个以这个前缀开头的数字,我们就认为这个位置可以为1,再往下走考虑下一位,

如果1的个数不满足得话,说明这一位肯定是0了,此时要进行一步合并操作,将0下面的部分合并到1上,因为此位不必要是1所以0/1都可以。

对于'|',有点复杂我感觉,我们考虑遍历每个数字,是1得位我们就不必管了,然后从最高位的0开始看看是否能变为1.

例如,对于1000(2),我们首先找有没有x100(2),如果有再找x110(2),高位如果找不到了就找低位,最后得到的就是最大值,

我们预处理出每个数能拆出来的数,1001->1000,0001,1001。。。依次类推,用一个标记数组。

之后循环每一个数的时候,记录由高位到低位'0'出现的位置,之后贪心高位找到最大的,只要标记过这个数就表示可以进行或操作。

 #include<bits/stdc++.h>
using namespace std;
int num[],a[];
int ch[][],cnt[],sz;
void irt(int x)
{
int p=;
for(int i=;i>=;--i){
int bit=(x&(<<i))?:;
if(ch[p][bit]==-)
{
ch[sz][]=ch[sz][]=-;
cnt[sz]=;
ch[p][bit]=sz++;
}//cout<<p<<endl;
p=ch[p][bit];
cnt[p]++;
}
}
void uno(int &x,int y)
{
if(y==-) return;
if(x==-) {ch[sz][]=ch[sz][]=-;cnt[sz]=;x=sz++;}
cnt[x]+=cnt[y];
uno(ch[x][],ch[y][]);
uno(ch[x][],ch[y][]);
}
int solve1(int n)
{
int p=,ret=;
for(int i=;i>=;--i){
if(ch[p][]!=-&&cnt[ch[p][]]>=)
ret|=(<<i);
else uno(ch[p][],ch[p][]);
p=ch[p][];
}
return ret;
} int solve2(int x)
{
int ret=,p=;
for(int i=;i>=;--i){
int bit=(x&(<<i))?:;
if(ch[p][bit^]!=-) {p=ch[p][bit^];ret|=(<<i);}
else p=ch[p][bit];
if(p==-) break;
}
return ret;
}
bool dp[(<<)];
int solve3(int n)
{
int i,j,ret=;
memset(dp,,sizeof(dp));
for(i=;i<=n;++i) dp[a[i]]=;
for(i=(<<);i>=;--i)
{
for(j=;j>=;--j)
{
if(!(i&(<<j))) dp[i]|=dp[i|(<<j)];
}
}
int t[],p=;
for(i=;i<=n;++i)
{
p=;
for(j=;j>=;--j)
if(!(a[i]&(<<j))) t[p++]=(<<j);
int x=;
for(j=;j<p;++j)
{
if(dp[x|t[j]]) x|=t[j];
}
ret=max(ret,x|a[i]);
}
return ret;
}
int main()
{
int i,j,k,n,m,t,op; // freopen("in.txt","r",stdin);
cin>>t;
for(int cas=;cas<=t;++cas)
{
sz=;
int xo=;
cin>>n>>op;
memset(num,,sizeof(num));
ch[sz][]=ch[sz++][]=-;cnt[]=;
for(i=;i<=n;++i)
{
scanf("%d",a+i);
if(op==) xo=max(xo,solve2(a[i]));
irt(a[i]);
}
printf("Case #%d: ",cas);
switch(op){
case :cout<<solve1(n)<<endl;break;
case :cout<<xo<<endl;break;
case :cout<<solve3(n)<<endl;break;
}
}
return ;
}

玲珑oj 1028 贪心的更多相关文章

  1. 玲珑学院OJ 1028 - Bob and Alice are playing numbers 字典树,dp

    http://www.ifrog.cc/acm/problem/1028 题解处:http://www.ifrog.cc/acm/solution/4 #include <cstdio> ...

  2. Light OJ 1028 - Trailing Zeroes (I) (数学-因子个数)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1028 题目大意:n除了1有多少个因子(包括他本身) 解题思路:对于n的每个因子 ...

  3. 玲珑oj 1117 线段树+离线+离散化,laz大法

    1117 - RE:从零开始的异世界生活 Time Limit:1s Memory Limit:256MByte Submissions:438Solved:68 DESCRIPTION 486到了异 ...

  4. 九度OJ 1028:继续畅通工程 (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3140 解决:1338 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有 ...

  5. oj教程--贪心

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...

  6. SWUST OJ(1028)

    特定字符序列的判断 #include <iostream> #include <cstdlib> #include <stack> #include <str ...

  7. 玲珑OJ 1129 - 喵哈哈村的战斗魔法师丶坏坏い月

    1129 - 喵哈哈村的战斗魔法师丶坏坏い月 Time Limit:3s Memory Limit:256MByte Submissions:315Solved:71 DESCRIPTION 坏坏い月 ...

  8. 玲珑oj 1121 思维

    1121 - Reverse the lights Time Limit:2s Memory Limit:256MByte Submissions:376Solved:111 DESCRIPTION ...

  9. 玲珑oj 1128 RMQ模板

    1128 - 咸鱼拷问 Time Limit:3s Memory Limit:128MByte Submissions:380Solved:118 DESCRIPTION 给你两个序列A,B.每个序列 ...

随机推荐

  1. phpcms发布到服务器修改

    请进行以下步骤的修改: 1.修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名就可以了. 2.进行后台设置->站点管理 对相应的站点的域名进 ...

  2. PKU 3318 Matrix Multiplication(随机化算法||状态压缩)

    题目大意:原题链接 给定三个n*n的矩阵A,B,C,验证A*B=C是否成立. 所有解法中因为只测试一组数据,因此没有使用memset清零 Hint中给的傻乎乎的TLE版本: #include<c ...

  3. Zookeeper那些事

    一. 什么是Zookeeper Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务 它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务, ...

  4. NodeJS NPM HTTPS

    npm config set registry http://registry.npmjs.org/

  5. Linux CentOS6环境下MySQL5.1升级至MySQL5.5版本过程

    转载地址:http://www.laozuo.org/6145.html 老左今天有在帮朋友的博客搬迁到另外一台VPS主机环境,其环境采用的是LLSMP架构的,原先的服务器采用的是LNMP网站环境,其 ...

  6. windows安装git客户端

    1:线上git地址 https://github.com/ 2:tortoiseGit地址 http://tortoisegit.org 3:安装步骤 操作系统:Windows XP SP3 Git客 ...

  7. flume从log4j收集日志输出到kafka

    1. flume安装 (1)下载:wget http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.1.tar.gz (2)解压:ta ...

  8. spring cloud要点简介及常用组件

    spring cloud基于spring boot spring cloud是通过包装其他技术框架实现的,例如OSS组件,实现了一套通过基于注解.java配置和基于模板开发的微服务框架. spring ...

  9. Junit中的setup和teardown方法

    setup需要@before注解,实现测试前的初始化工作 teardown需要@after注解,测试完成后垃圾回收等后续工作

  10. 从HighGUI的一段代码中看OpenCV打开视频的方式

      OpenCV的HighGUI提供了视频和摄像头的直接打开.那么它是如何实现的了?这里进行初步分析.     ;    switch(apiPreference) {    default:    ...