CF1582 F1. Korney Korneevich and XOR (easy version)(dp)
阿新 • • 發佈:2021-11-01
目錄
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; }