链接:
https://www.nowcoder.com/acm/contest/84/E
来源:牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制: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值一共有多少个。
定义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; }