P2114 起床苦难综合征求条(悬 2 关)
  • 板块学术版
  • 楼主细数繁星
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/8 11:02
  • 上次更新2024/8/8 11:45:46
查看原帖
P2114 起床苦难综合征求条(悬 2 关)
824363
细数繁星楼主2024/8/8 11:02
#include <bits/stdc++.h>
#define rty printf("Yes\n");
#define RTY printf("YES\n");
#define rtn printf("No\n");
#define RTN printf("NO\n");
#define rep(v,b,e) for(int v=b;v<=e;v++)
#define repq(v,b,e) for(int v=b;v<e;v++)
#define rrep(v,e,b) for(int v=b;v>=e;v--)
#define rrepq(v,e,b) for(int v=b;v>e;v--)
#define stg string
#define vct vector
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

void solve() {
	
}

#define XOR 0
#define AND 1
#define OR 2

bool two_jz[(int)1e5 + 5][31];
int type[(int)1e5 + 5];
bool two_res[31];
int max_cnt = 0;

main() {
//	int t; cin >> t; while (t--) solve();
  int n, m;
  cin >> n >> m;
  rep(i, 1, n) {
    stg type; int sz;
    cin >> type >> sz;
    int cnt = 0;
    switch (type[0]) {
      case 'X':
        type[i] = XOR;
        break;
      case 'A':
        type[i] = AND;
        break;
      case 'O':
        type[i] = OR;
        break;
    }
    while (sz) {
      two_jz[i][++cnt] = sz & 1;
      sz >>= 1;
    }
    max_cnt = max(max_cnt, cnt);
  }

  int jz_cnt = max_cnt;
  while (1 << jz_cnt > m) {
    jz_cnt--;
  }
  rrep(i, 1, max_cnt) {
    bool zero = 0;
    bool one = 0;
    rep(j, 1, n) {
      if (type[j] == XOR) { zero ^= two_jz[j][i]; } 
      if (type[j] == AND) { zero &= two_jz[j][i]; }
      if (type[j] == OR)  { zero |= two_jz[j][i]; }
      if (jz_cnt >= i) {
        if (type[j] == XOR) { one ^= two_jz[j][i]; }
        if (type[j] == AND) { one &= two_jz[j][i]; }
        if (type[j] == OR)  { one |= two_jz[j][i]; }
      }
    }
    two_res[i] = zero | one;
  }
  int res = 0;
  rep(i, 1, max_cnt) {
    res += (1 << (i - 1)) * two_res[i];
  }
  cout << res;
	return 0;
}
2024/8/8 11:02
加载中...