yukicoder No.387 ハンコ
解法
bitset を使うアレです。
各色ごとに考えます。
色 i が現れる位置 pos を覚えておき, memo |= b*2^pos とすれば, memo という配列に「色 i が塗られる場所」が記録されます。
これをすべての色について行えば良いです。
const int MAXA = 100001; const int MAXN = 100001; vector<int> pos[MAXA]; int B[MAXN]; int main() { cin.tie(0); ios::sync_with_stdio(false); int N; cin >> N; for (int i = 0; i < N; i++) { int a; cin >> a; pos[a].push_back(i); } for (int i = 0; i < N; i++) cin >> B[i]; bitset<2*MAXN> b; for (int i = 0; i < N; i++) if (B[i]) b.set(i); bitset<2*MAXN> ans; for (int i = 0; i < MAXA; i++) if (pos[i].size()) { bitset<2*MAXN> memo; for (int j : pos[i]) { memo |= b<<j; } ans ^= memo; } for (int i = 0; i < 2*N-1; i++) { if (ans[i]) cout << "ODD" << endl; else cout << "EVEN" << endl; } return 0; }