#include #include #define MAXDAYS 30 #define MAXREQ 52 int n, reqindex; int old[MAXDAYS]; int new[MAXDAYS]; int req[MAXREQ]; void input(); void calculate(); void output(); int find(int k); void reverse(int k); void input() { scanf("%d",&n); if (n == 0) exit(0); int i; for (i = 0; i < n; i++) scanf("%d",&old[i]); for (i = 0; i < n; i++) scanf("%d",&new[i]); for (i = 0; i < MAXREQ; i++) req[i] = 0; reqindex = 0; } int find(int k) { int i; for (i = 0; i < n; i++) if (old[i] == k) return i; return -1; } void reverse(int k) { int i, j, l = (k - 1) / 2; for (i = 0; i <= l; i++) { j = old[i]; old[i] = old[k - i]; old[k - i] = j; } } void findgroup(int actindex, int findex, int *gnum, int *lgindex) { *gnum = 1; *lgindex = findex; while (--actindex >= 0 && --findex >= 0 && new[actindex] == old[findex]) ++(*gnum); } void findrgroup(int actindex, int findex, int *rgnum, int *lrgindex) { *rgnum = 1; *lrgindex = findex; while (--actindex >= 0 && ++findex < n && new[actindex] == old[findex]) {++(*rgnum); ++(*lrgindex);} } void movegroup(int gnum, int lgindex, int actindex) { reverse(lgindex); reverse(actindex); req[reqindex++] = lgindex + 1; req[reqindex++] = actindex + 1; } void movergroup(int rgnum, int lrgindex, int actindex) { if (lrgindex != rgnum - 1) { reverse(lrgindex); reverse(rgnum - 1); req[reqindex++] = lrgindex + 1; req[reqindex++] = rgnum; } reverse(actindex); req[reqindex++] = actindex + 1; } void movenumber(int findex, int actindex) { if (findex != 0) { reverse(findex); req[reqindex++] = findex + 1; } if (findex != 0) { reverse(actindex); req[reqindex++] = actindex + 1; } } void calculate() { /* int i, j; for (i = n - 1; i > 0; i--) { if (old[i] != new[i]) { output(); j = find(new[i]); if (j > 0) { reverse(j); req[reqindex++] = j + 1; } reverse(i); req[reqindex++] = i + 1; } }*/ int actindex, gnum, rgnum, lgindex, lrgindex, findex; for (actindex = n - 1; actindex > 0; actindex--) { if (new[actindex] != old[actindex]) { findex = find(new[actindex]); findgroup(actindex, findex, &gnum, &lgindex); findrgroup(actindex, findex, &rgnum, &lrgindex); if (gnum > 1) {movegroup(gnum, lgindex, actindex); actindex -= gnum - 1;} else if (rgnum > 1) {movergroup(rgnum, lrgindex, actindex); actindex -= rgnum - 1;} else movenumber(findex, actindex); } } } void output() { int i; /* printf("old:"); for (i = 0; i < n; i++) printf("%d ",old[i]); putchar('\n');*/ for (i = 0; i < MAXREQ && req[i] != 0; i++) printf("%d ",req[i]); putchar('\n'); } int main(int argc, char **argv) { while (1) { input(); calculate(); output(); } return 0; }