牛客训练赛16E题

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

题目描述

给定n个数字a1, a2, ..., an
定义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;
} 


猜你喜欢

转载自blog.csdn.net/soul_97/article/details/80258336