题意:
题意说给了一个数组,你可以选出一个上升的子序列,然后这个序列的元素全部异或起来等于x,求出这样的x到底有多少个
思考:
看到数组的元素最大才500,那么全部异或起来最大也不过超过512。建立dp[i]代表,达到当前元素的时候,最后一位最小的值是多少。这种不仅能维护出是否可达,而且还能保证最优的上升序列。
代码:
int T,n,m;
int va[N];
int dp[N];
signed main()
{
IOS;
cin>>n;
m = 512;
for(int i=1;i<=n;i++) cin>>va[i];
for(int i=1;i<=m;i++) dp[i] = inf;
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
if(dp[j]<va[i])
dp[j^va[i]] = min(dp[j^va[i]],va[i]);
}
}
vector<int > v;
for(int i=0;i<m;i++)
{
if(dp[i]<inf)
v.pb(i);
}
cout<<v.size()<<"\n";
for(auto t:v) cout<<t<<" ";
cout<<"\n";
return 0;
}
总结: