链接:https://www.nowcoder.com/acm/contest/84/E
来源:牛客网
来源:牛客网
题目描述
给定n个数字a1, a2, ..., an。
定义f(l, r) = al | al+1| ... | ar。
现在枚举(1 <= l <= r <= n),问不同的f值一共有多少个。
定义f(l, r) = al | al+1| ... | ar。
现在枚举(1 <= l <= r <= n),问不同的f值一共有多少个。
输入描述:
第一行一个整数n表示数组大小 (1 <= n <= 100,000);
第二行n个整数满足0 <= ai <= 1000,000。
输出描述:
输出一个整数表示不同的f值一共有多少个。
此题你可以忽视题中的区间枚举问题 将问题直接简化成为 给你n个数字 求 这n个数字任意组合最后能求出多少个 | 操作的结果 思路:我们可以一边输入一遍处理 每次保留上一次的最新值 和下一个数字做 | 操作 采用两个set 一个存数 一个枚举上一次的结果 题中给了 数字的最大值为 1000,000 那么异或的最大结果不超过 2e6
#include<bits/stdc++.h> using namespace std; const int maxn = 2000005; set<int> s[2]; int visit[maxn]; int n, t, flag; int main() { cin >> n; for(int i = 1;i <= n;i ++) { cin >> t; flag = 1 - flag; s[flag].clear(); set<int>::iterator it; for(it = s[1 - flag].begin();it != s[1 - flag].end();it ++) { int tmp = (*it)|t; visit[tmp] = 1; s[flag].insert(tmp); } s[flag].insert(t); visit[t] = 1; } int ans = 0; for(int i = 0;i < maxn;i ++) if(visit[i]) ans ++; cout << ans << endl; return 0; }