对于一个问题,我们会给我们一个大小为n<10^5
且每个0<=a[i]<10^9
的数组,这是一个巨大的疑问。
我们必须计算方式,以使n个元素说b[i]
,以使每个0<=b[i]<=a[i]
及其xor等于a[0]^a[1]..^a[n-1]
的xor。所以我写了一个代码,可以为小输入提供正确的答案,并且我已经确定了dp的状态,所以现在我可以记住它了。但是当我惊讶地看到社论时,解决方案是基于逐位计算然后计数的。
所以,即使我们能记住为什么我们必须一点一点地做,这也是我的疑问。我们不能使用按位运算符来获取解决方案吗?
PS:link 编辑
#include <bits/stdc++.h>
using namespace std;
int ans(int *a,int n,int level,int cur,int xor_val)
{
if(level==n)
{
if(cur==xor_val)
{
return 1;
}
return 0;
}
int cnt=0;
for(int i=0;i<=a[level];i++)
{
if(level==0)
{
cur=i;
cnt+=ans(a,n,level+1,cur,xor_val);
}
else
{
cnt+=ans(a,n,level+1,cur^i,xor_val);
}
}
return cnt;
}
int main()
{
int *a,n,t;
cin>>t;
while(t--)
{
cin>>n;
a=new int[n];
int xor_val;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(i==0)
xor_val=a[i];
else
xor_val^=a[i];
}
int cur;
cout<<ans(a,n,0,cur,xor_val)<<"\n";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int ans(int *a,int n,int level,int cur,int xor_val)
{
if(level==n)
{
if(cur==xor_val)
{
return 1;
}
return 0;
}
int cnt=0;
for(int i=0;i<=a[level];i++)
{
if(level==0)
{
cur=i;
cnt+=ans(a,n,level+1,cur,xor_val);
}
else
{
cnt+=ans(a,n,level+1,cur^i,xor_val);
}
}
return cnt;
}
int main()
{
int *a,n,t;
cin>>t;
while(t--)
{
cin>>n;
a=new int[n];
int xor_val;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(i==0)
xor_val=a[i];
else
xor_val^=a[i];
}
int cur;
cout<<ans(a,n,0,cur,xor_val)<<"\n";
}
return 0;
}