链接:https://ac.nowcoder.com/acm/contest/549/D
来源:牛客网
位运算是一个非常重要的东西。而小A最近在学习位运算,小A看到了一道很简单的例题,是说从N个数里面选出N-1个数要让它们或起来的值最大,小A想知道这个答案是多少。你可以帮帮他吗?
输入描述:
第一行一个整数N表示有N个数接下来一行N个数表示A1,A2…AN第一行一个整数N表示有N个数接下来一行N个数表示A1,A2…AN
输出描述:
一行输出个结果代表最大值一行输出个结果代表最大值
示例1
输入
5
1 2 4 8 16
输出
30
链接:https://ac.nowcoder.com/acm/contest/549/D
来源:牛客网
说明
选择2,4,8,16或的和是最大的,没有比这个更大的方案。
备注:
1≤N≤5e6,1≤Ai≤longlong1≤N≤5e6,1≤Ai≤longlong
维护前缀和后缀 枚举每个数的前缀|后缀 求最大值
学到了
#include <bits/stdc++.h>
using namespace std;
long long a[5000050],pri[5000050],sub[5000050];
int main()
{
long long n,m,i;
while(scanf("%lld",&n)!=EOF)
{
memset(pri,0,sizeof(pri));
memset(sub,0,sizeof(sub));
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
if(i>1)
pri[i]=pri[i-1]|a[i-1];
}
for(i=n-1;i>=0;i--)
sub[i]=sub[i+1]|a[i+1];
m=0;
for(i=1;i<=n;i++)
{
m=max(m,pri[i]|sub[i]);
}
cout<<m<<'\n';
}
return 0;
}