mayoko’s diary

プロコンとかいろいろ。

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