nowcode/84/E求值 set

链接: https://www.nowcoder.com/acm/contest/84/E
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定n个数字a 1, a 2, ..., a n
定义f(l, r) = a l | a l+1| ... | a r
现在枚举(1 <= l <= r <= n),问不同的f值一共有多少个。

输入描述:

第一行一个整数n表示数组大小 (1 <= n <= 100,000);
第二行n个整数满足0 <= ai <= 1000,000。

输出描述:

输出一个整数表示不同的f值一共有多少个。
示例1

输入

3
1 2 0

输出

4
示例2

输入

10
1 2 3 4 5 6 1 2 9 10

输出

11


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define all(x) begin(x),end(x)
ll rd(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
 
const int N=1e5+10;
int a[N];
 
int main(){
   //freopen("in.txt","r",stdin);
    int n=rd();
    for(int i=0;i<n;i++)
    a[i]=rd();
    set<int> pre;
    set<int> f;
    for(int i=0;i<n;i++){
        pre.insert(0);
        set<int> now;
        for(auto v:pre)now.insert(v|a[i]);
        for(auto v:now)f.insert(v);
        swap(pre,now);
    }
    cout<<f.size()<<endl;
}

猜你喜欢

转载自blog.csdn.net/ujn20161222/article/details/80168284
set