链接: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;
}