D. Ehab and the Expected XOR Problem
theme:给定n与x,要求构造一个数组,使得数组的任意子串的抑或和都不0且不为x,且每个元素的值都<2^n,求能构造出的最长数组。1≤n≤18,1≤x<2^18
solution:要求所有子串的抑或和,所以我们考虑前缀抑或和,因为al^a(l+1)^...^ar=sum(r)^sum(l-1),所以我们可以先构造一个抑或前缀和数组,只要保证数组中任意两个元素不相同,就可以保证原数组任意子串抑或和不为0,同理只要保证抑或和任意两个元素抑或和不为x,就可以由sum(i)^sum(i-1)构造出原数组。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
bool exist[1<<18];
vector<int>v;
int main()
{
ll n,x;
cin>>n>>x;
exist[0]=true;
v.push_back(0);
for(int i=1;i<(1<<n);++i)
{
if(exist[i^x])
continue;
exist[i]=1;
v.push_back(i);
}
int l=v.size()-1;
cout<<l<<"\n";
for(int i=1;i<=l;++i)
printf("%d ",v[i]^v[i-1]);
}