/* Wed Oct 29 23:38:53 JST 2003 */ #include #include #include typedef struct _point_t { int x, y; } point_t; int dx[12] = {1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1}; int dy[12] = {0, 1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1}; int pointcmp(const void *aa, const void *bb) { point_t *a = (point_t *)aa, *b = (point_t *)bb; if (a->x < b->x) { return -1; } if (a->x > b->x) { return +1; } if (a->y < b->y) { return -1; } if (a->y > b->y) { return +1; } return 0; } int makemove(char str[], point_t move[], int offset) { int i, len; int x = 0, y = 0; len = strlen(str); move[0].x = 0; move[0].y = 0; for (i = 0; i < len; i++) { x += dx[ str[i]-'a' + offset ]; y += dy[ str[i]-'a' + offset ]; move[i+1].x = x; move[i+1].y = y; } qsort(move, len+1, sizeof(point_t), pointcmp); for (i = 1; i < len+1; i++) { move[i].x += (-move[0].x); move[i].y += (-move[0].y); } move[0].x = move[0].y = 0; return len+1; } int equal(point_t move1[], int move1len, point_t move2[], int move2len) { int i; if (move1len != move2len) return 0; for (i = 0; i < move1len; i++) { if (move1[i].x != move2[i].x || move1[i].y != move2[i].y) { return 0; } } return 1; } int main() { int i; int records, loop; char str[1024]; point_t move[101]; int movelen; point_t move2[101]; int move2len; int flag; gets(str); records = atoi(str); for (loop = 0; loop < records; loop++) { gets(str); movelen = makemove(str, move, 0); gets(str); flag = 0; for (i = 0; i < 6; i++) { move2len = makemove(str, move2, i); if (equal(move, movelen, move2, move2len)) { flag = 1; break; } } gets(str); if (flag) { printf("true\n"); } else { printf("false\n"); } } return 1; } /* Thu Oct 30 00:10:01 JST 2003 */