http://ace.delos.com/usacoprob2?a=jku7JIDKPop&S=contact 对二进制数的操作技巧 #include <stdio.h> #include <stdlib.h> #define MAXSEQ (1<<13) typedef struct { unsigned int bits, count; } Seq; int a, b, n; char tmp[20]; Seq res[MAXSEQ]; void addseq(unsigned bits, unsigned i) { bits &= (1 << i) - 1; bits |= 1 << i; res[bits].count++; } void solve() { char ch; int bits, nbit, i; bits = nbit = 0; while ((ch = getchar()) != EOF) { if (ch != '0' && ch != '1') continue; if (nbit < b) nbit++; bits <<= 1; if (ch == '1') bits |= 1; for (i = a; i <= nbit; i++) addseq(bits, i); } } int cmp(const void *x, const void *y) { Seq *a, *b; a = (Seq *) x; b = (Seq *) y; if (a->count < b->count) return 1; if (a->count > b->count) return -1; if (a->bits < b->bits) return -1; if (a->bits > b->bits) return 1; return 0; } void printbits(int bits) { if (bits == 0 || bits == 1) return; printbits(bits >> 1); printf("%d", bits & 1); } void print() { int i, k, c; char *s; i = 0; while (n) { c = res[i].count; if (c == 0) break; printf("%d/n", c); n--; s = ""; for (k = 0; res[i].count == c; i++, k++) { printf(s); printbits(res[i].bits); if (k % 6 == 5) s = "/n"; else s = " "; } printf("/n"); } } void init() { int i; scanf("%d%d%d/n", &a, &b, &n); for (i = 0; i < MAXSEQ; i++) res[i].bits = i; } int main() { freopen("contact.in", "r", stdin); freopen("contact.out", "w", stdout); init(); solve(); qsort(res, MAXSEQ, sizeof(Seq), cmp); print(); return 0; }