题解:P7693 [CEOI2003] Shift Register

首A!

话不多说上代码

#include <bits/stdc++.h>
int n, fn, i, j, k, l;
unsigned char m[10000][1251];
int s[10000], a[20000];
int main() {
    
    scanf("%d", &n);
    fn = (n + 8) >> 3;

    for (i = 0; i < n << 1; ++i)
        scanf("%d", &a[i]);
    for (i = 0; i < n; ++i)
        for (j = 0; j <= n; ++j)
            if (a[i + j])
                m[i][j >> 3] ^= 1 << (j & 7);
    unsigned char tmp[sizeof m[0]];
    for (i = j = 0; i < n; ++i) {
        s[i] = -1;
        for (k = j; k < n; ++k)
            if (m[k][i >> 3] >> (i & 7) & 1)
                break;
        if (k == n)
            continue;
        if (j != k) {
            __builtin_memcpy(&tmp,  &m[j], fn);
            __builtin_memcpy(&m[j], &m[k], fn);
            __builtin_memcpy(&m[k], &tmp,  fn);
        }

        for (k = 0; k < n; ++k)
            if (k != j && (m[k][i >> 3] >> (i & 7) & 1))
                for (l = 0; l < fn; ++l)
                    m[k][l] ^= m[j][l];

        s[i] = j++;
    }

    int ok = 1;

    for (i = 0; i < n && ok; ++i) {
        if (!(m[i][n >> 3] >> (n & 7) & 1))
            continue;

        for (j = 0; j < n; ++j)
            if (m[i][j >> 3] >> (j & 7) & 1)
                break;

        if (j == n)
            ok = 0;
    }

    if (ok) {
        for (i = n - 1; i >= 0; --i)
            printf(i ? "%d " : "%d\n", s[i] >= 0 ? m[s[i]][n >> 3] >> (n & 7) & 1 : 0);
    } else
        puts("-1");
}
posted @ 2026-05-24 13:42  Synthx  阅读(2)  评论(0)    收藏  举报