G. Expanding Array

  • 利用异或无限扩展(x,y),是进行“宽度优先搜索”的先决条件;于是你也不能认为,出现了相同的数就可以终止搜索,因为它可能还会对之后的结果产生影响
  • 更轻巧的思维方式是,考虑011/101,考虑000~111的所有数字是否可以构造出来
  • 所有的STL容器都支持关于容器大小的size/empty方法
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[100005];
unordered_map<int,bool>q;
int s[3];
void calc(int x,int y)
{
	int val=0;
	for(int i=29;i>=0;i--)
	{
		int u=((x>>i)&1),v=((y>>i)&1);
		if(u==0&&v==1)
		{
			val+=(s[0]*(1<<i));
		}
		else if(u==1&&v==0)
		{
			val+=(s[1]*(1<<i));
		}
		else if(u&&v)
		{
			val+=(s[2]*(1<<i));
		}
	}
	if(q.find(val)==q.end())
	{
		q[val]=true;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(q.find(a[i])==q.end())
		{
			q[a[i]]=true;
		}
	}
	for(int i=1;i<n;i++)
	{
		for(s[0]=0;s[0]<2;s[0]++)
		{
			for(s[1]=0;s[1]<2;s[1]++)
			{
				for(s[2]=0;s[2]<2;s[2]++)
				{
					calc(a[i],a[i+1]);
				}
			}
		}
	}
	cout<<q.size()<<endl;
	return 0;
}
posted @ 2024-11-04 16:35  D06  阅读(1)  评论(0编辑  收藏  举报