1. 程式人生 > 其它 >CF1582 F1. Korney Korneevich and XOR (easy version)(dp)

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;
}