目录
题目
给一个长度为n 的序列a1, a2,. . . , (n,寻找在α的所有递增子序列(可以为空)的异或和中出现的
数。
格式
输入格式:第一行—个正整数n表示序列长度;
第二行n个整数表示序列a。
输出格式:第一行输出满足要求的数的个数;
第二行从小到大输出在α的所有递增子序列(可以为空)的异或和中出现的数。
样例1
输入:
4
4 2 2 4
输出:
4
0 2 4 6
样例2
输入:
2
1 5
输出:
4
0 1 4 5
样例3
输入:
2
5 1
输出:
3
0 1 5
备注
其中:1≤n≤1e5,1 ≤a[i]≤500
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int n, a[N], dp[N];
int main()
{
//这里的dp[j]表示异或和为j时,所有递增子序列中末尾数最小的数
cin >> n;
memset(dp, 0x3f3f3f3f, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= 550; j++) //根据题目的所给的范围,推导出异或和不会超过511
{
if (dp[j] < a[i])//说明当前的子序列可以与a[i]组成一个新的递增子序列
{
dp[j ^ a[i]] = min(dp[j ^ a[i]], a[i]);
}
}
}
vector<int> ans;
for (int i = 0; i <= 550; i++)
{
if (dp[i] != 0x3f3f3f3f) //将重新赋值后的异或和保存下来
ans.push_back(i);
}
cout << ans.size() << endl;
for (int id : ans)
{
cout << id << " ";
}
return 0;
}
注:本题解题思路来源b站up主:轩哥码题,有需要可跳转B站看up详细讲解。附up链接:b站up个人主页