#include #include void reverse(int *pole, int N) { int i, tmp; for(i = 0; i < (N/2); i++) { tmp = pole[i]; pole[i] = pole[N - i - 1]; pole[N - i - 1] = tmp; } return ; } void pp(int * pole, int N) { int i; for(i = 0; i < N; i++) { printf("%d ", pole[i]); } printf("\n"); } int rep(int *pin, int *pout, int N, int *preq, int rmax) { int i, j , rsize = 0, time = 0; int k; while(1) { if(rsize >= rmax) { return -1; } for( i = 0; pin[0] != pout[i]; i++ ) ; for( j = 1; i+j < N && pin[j] == pout[ i + j ]; j++ ) ; if(j >= N) return rsize; if(j > 1) { reverse(pin, j); preq[rsize++] = j; continue; } if( (i + j) >= N) { reverse(pin, N); preq[rsize++] = N; continue; } for(k = 0; pin[k] != pout[ j + i]; k++); reverse(pin, k); preq[rsize++] = k; /*printf( "%d: ", ++time ); pp( pin, N );*/ } } int rep2(int *pin, int *pout, int N, int *preq, int rmax) { int i, j , rsize = 0, time = 0; while(1) { for(i = N - 1; (i >= 0) && (pin[i] == pout[i]); i--) ; if(i <= 0) return rsize; if(rsize >= rmax) { return -1; } for(j = 0; j < i; j++) { if(pin[j] == pout[i]) { break; } } if(j != 0) { preq[rsize++] = j + 1; reverse(pin, j + 1); printf( "%d: ", ++time ); pp( pin, N ); } preq[rsize++] = i + 1; reverse(pin, i + 1); printf( "%d: ", ++time ); pp( pin, N ); } } int main( int argc, char **argv ) { int N; int in[30]; int tmp[30]; int out[30]; int i; int req[52]; while(1) { scanf("%d ", &N); if(!N) return 0; for(i = 0; i < N; i++) { scanf("%d ", in + i); } for(i = 0; i < N; i++) { scanf("%d ", out + i); } memcpy( tmp, in, sizeof(in) ); if( (i = rep(in, out, N, req, 52)) < 0) { i = rep2(tmp, out, N, req, 52); if(i < 0) return 1; } pp(req, i); } return 0; }