Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #include <algorithm>
- #include <map>
- #define bit(i, x) (((x) >> (i)) & 1)
- #define task ""
- using namespace std;
- using ll = long long;
- const int N = 2e6 + 2;
- ll n, m, a[N];
- int Sub, maxn, dp[65][2];
- int dp3[5003];
- int dp4[N];
- bool ck[N];
- void Read(){
- cin >> n >> m;
- if(n >= 1e9){
- if(m == (1ll << 60) - 1)
- Sub = 1;
- else
- Sub = 2;
- }
- else{
- for(int i = 1; i <= n; ++i)
- cin >> a[i];
- if(n <= 5000)
- Sub = 3;
- else
- Sub = 4;
- }
- }
- int f(int i, bool ok){
- if(i < 0) return 0;
- if(dp[i][ok] != -1) return dp[i][ok];
- dp[i][ok] = 0;
- dp[i][ok] = max(dp[i][ok], f(i - 1, ok || bit(i, n) == 1));
- if(ok || bit(i, n) == 1) dp[i][ok] = max(dp[i][ok], f(i - 1, ok) + 1);
- return dp[i][ok];
- }
- void Sub_1(){
- maxn = log2(n);
- memset(dp, -1, sizeof dp);
- cout << f(maxn, 0);
- }
- void Sub_2(){
- }
- void Sub_3(){
- for(int i = 1; i <= n; ++i)
- a[i] &= m;
- sort(a + 1, a + n + 1);
- int ans(0);
- for(int i = 1; i <= n; ++i){
- for(int j = 0; j < i; ++j)
- if((a[i] & a[j]) == a[j])
- dp3[i] = max(dp3[i], dp3[j] + 1);
- ans = max(ans, dp3[i]);
- }
- cout << ans;
- }
- template<class T>
- inline void Maximize(T &x, T y){
- if(x < y) x = y;
- }
- void Standard(ll &x){
- ll v = x;
- x = 0;
- int j = 0;
- for(int i = 0; i < 30; ++i)
- if(bit(i, m)){
- x |= (bit(i, v)) << j;
- ++j;
- }
- }
- void Sub_4(){
- for(int i = 1; i <= n; ++i){
- a[i] &= m;
- Standard(a[i]);
- ck[a[i]] = 1;
- }
- for(int i = 1; i < (1 << 20); ++i)
- if(!ck[i])
- a[++n] = i;
- sort(a + 1, a + n + 1);
- int ans(0);
- for(int i = 0; i <= n; ++i){
- if(ck[a[i]]) Maximize(ans, dp4[a[i]]);
- for(int j = 0; j < 20; ++j)
- if(!bit(j, a[i]))
- Maximize(dp4[a[i] | (1 << j)], dp4[a[i]] + ck[a[i] | (1 << j)]);
- if(ck[a[i]])
- ++dp4[a[i]];
- }
- cout << ans;
- }
- int32_t main(){
- if(fopen(task".INP", "r")){
- freopen(task".INP", "r", stdin);
- freopen(task".OUT", "w", stdout);
- }
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- Read();
- if(Sub == 1) Sub_1();
- else if(Sub == 2) Sub_2();
- else if(Sub == 3) Sub_3();
- else Sub_4();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement