F1. Korney Korneevich and XOR (easy version)
题面意思,给你一个长度为n的序列,求其严格递增子序列的异或和有多少种值,并输出所有可能的值。
序列的元素值范围是500以内,n的范围是1e5。
因为
a
i
a_i
ai的范围是500,所以所有元素的异或值不会超过512。可以暴力。
总复杂度是o(n * 512)。
利用dp[i]记录 当异或值是i时 尾部元素的可能的最小值。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N];
int dp[512 + 10];
int main()
{
int T;
// cin >> T;
T = 1;
while (T--)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= 512; i++)
dp[i] = 1000;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= 512; j++)
{
if (dp[j] < a[i])//当a[i]比dp[j]的值大,说明a [i]可以
//更新这个严格递增序列。
dp[j ^ a[i]] = min(dp[j ^ a[i]], a[i]);
}
}
vector <int> ans;
for (int i = 0; i <= 512; i++)
{
if (dp[i] != 1000)
ans.push_back(i);
}
cout << ans.size() << endl;
for(int i = 0 ; i < ans.size(); i ++)
cout << ans[i] << " ";
cout << endl;
}
return 0;
}