CF1582 F1. Korney Korneevich and XOR (easy version)(dp)
目录
Description
从 \(n\) 个数中选择某些构成单调递增子序列,求这些子序列可以异或得到多少个不通过的数
State
\(1 \le n \le 10^5\)
\(0 \le a_i \le 500\)
Input
8
1 0 1 7 12 5 3 2
Output
12
0 1 2 3 4 5 6 7 10 11 12 13
Solution
设 \(dp[i][j]\) 表示以 \(i\) 结尾的子序列可以构成 \(j\)
之后可以推得 \(dp[k][j \ xor\ a[k]]\) 其中 \(k∈[i+1,n]\)
发现 \(dp\) 方程中与 \(i\) 无关,可以滚掉一维,其实就是背包变形
Code
const int N = 1e5 + 5;
int n, m, k, _;
int a[N];
int dp[600];
signed main()
{
// IOS;
while(~ sd(n)){
rep(i, 1, n) sd(a[i]);
ms(dp, inf);
dp[0] = 0;
for(int i = 1; i <= n; i ++){
for(int j = 0; j < 512; j ++){
if(a[i] > dp[j]) dp[j ^ a[i]] = min(dp[j ^ a[i]], a[i]);
}
}
vector<int> ans;
for(int i = 0; i < 512; i ++){
if(dp[i] != inf) ans.pb(i);
}
pd(ans.size());
for(auto it : ans) printf("%d ", it);
}
// PAUSE;
return 0;
}

浙公网安备 33010602011771号