- 关键发现:需要用位运算处理症状的变化每种药有治疗效果和副作用两个方面药物的作用顺序会影响最终结果
- 解题策略:使用二进制表示症状状态按顺序模拟每次服药过程计算每次服药后的症状数量
- 具体步骤:读入初始症状状态读入每种药的治疗效果和副作用模拟每次服药,更新症状状态统计当前症状数量
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
string initial;
cin >> initial;
// 将初始症状转换为整数
int state = 0;
for(int i = 0; i < n; i++) {
if(initial[i] == '1') {
state |= (1 << i);
}
}
int m;
cin >> m;
vector<pair<int, int>> medicines(m); // 每副药的治疗效果和副作用
// 读入每副药的信息
for(int i = 0; i < m; i++) {
string treat, side;
cin >> treat >> side;
int treat_mask = 0, side_mask = 0;
for(int j = 0; j < n; j++) {
if(treat[j] == '1') treat_mask |= (1 << j);
if(side[j] == '1') side_mask |= (1 << j);
}
medicines[i] = {treat_mask, side_mask};
}
int k;
cin >> k;
// 模拟服药过程
while(k--) {
int med;
cin >> med;
med--; // 转换为0-based索引
// 更新症状状态
state &= ~(state & medicines[med].first); // 去除被治愈的症状
state |= medicines[med].second; // 添加副作用症状
// 统计当前症状数量
cout << __builtin_popcount(state) << endl;
}
return 0;
}