题解: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");
}

浙公网安备 33010602011771号