- 利用异或无限扩展(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;
}