/* do rl, faster */ #include #include typedef struct side { unsigned int cw, rw, *a ; int xlen, maxa ; } side ; int size ; void init(side *a, int size) { a->a = (unsigned int *)calloc(sizeof(unsigned int), size) ; if (a->a == 0) { fprintf(stderr, "No memory.\n") ; exit(10) ; } a->xlen = 64 ; a->maxa = 1 ; a->cw = 0 ; a->rw = 1 ; } void advsame(side *a) { a->rw ^= (a->rw >> 1) | (a->cw << 31) ; a->cw ^= (a->cw >> 1) ; } void advlength(side *a) { a->cw ^= (a->cw << 1) | (a->rw >> 31) ; a->rw ^= a->rw << 1 ; a->xlen++ ; } void percolate(side *a, int gen) { /* should we grow the array? */ int i, j, b, shift ; unsigned int w ; unsigned int afterw = 0 ; int haveafter = 0 ; shift = a->xlen & 31 ; if (a->xlen > 64) { w = a->rw >> shift ; if (shift != 0) w |= a->cw << (32 - shift) ; afterw = w ; haveafter++ ; a->maxa++ ; if (a->maxa >= size) exit(0) ; i = gen - 1 ; while (i) { b = i & - i ; i &= ~b ; if (b+b <= a->maxa) a->a[a->maxa-b] ^= a->a[a->maxa-b-b] ; } a->xlen -= 32 ; } /* now percolate down */ b = gen & - gen ; for (j=0; jmaxa; j++) { int st = b ; w = 0 ; while (st+j > a->maxa) st >>= 1 ; while (st > j) { w ^= a->a[a->maxa-j-st] ; st >>= 1 ; } a->a[a->maxa-j] ^= w ; } if (haveafter) a->a[a->maxa] = afterw ; /* now update cw, rw bits */ if (shift == 0) { a->cw = a->a[a->maxa] ; } else { w = (1 << shift) - 1 ; a->cw = a->a[a->maxa] >> (32 - shift) ; a->rw = (a->rw & w) | (a->a[a->maxa] << shift) ; } } int main(int argc, char *argv[]) { side left, right ; int gen = 0, hgen=0, isr = 0 ; if (argc < 2 || sscanf(argv[1], "%d", &size) != 1) size = 10 ; if (size > 65000) { fprintf(stderr, "Can't do more than about 4B entries.\n") ; exit(10) ; } size *= 32768 ; init(&left, size) ; init(&right, size) ; while (1) { if (isr) { printf("R") ; if (right.rw & 1) isr = 0 ; advlength(&left) ; advsame(&right) ; } else { printf("L") ; if (left.rw & 1) isr = 1 ; advsame(&left) ; advlength(&right) ; } printf("\n") ; gen++ ; if (gen == 32) { hgen++ ; gen = 0 ; percolate(&left, hgen) ; percolate(&right, hgen) ; } } }