#include <stdio.h>
#include <string.h>

/* 文字列を逆順にコピーする (末尾に空文字を付加しない) */
char* strncpyr(char *s1, const char *s2, int n, int reversal) {
	int l2, i;
	l2 = strlen(s2);
	if (reversal == 0) {
		/* strncpy(s1, s2, n); */
		if (l2 > n) l2 = n;
		for (i = 0; i < l2; i++) s1[i] = s2[i];
		/* for (i = l2; i < n; i++) s1[i] = '\0'; */
	} else {
		if (l2 > n) l2 = n;
		for (i = 0; i < l2; i++) s1[i] = s2[l2 - 1 - i];
		/* for (i = l2; i < n; i++) s1[i] = '\0'; */
	}
	return s1;
}

/* 列車を再編成する */
void rearrange(char *s1, const char *s2, int n, int division, int order, int reversal_l, int reversal_r) {
	if (order == 0) {
		/* 順 */
		strncpyr(s1, s2, division, reversal_l); /* 左側 */
		strncpyr(s1 + division, s2 + division, n - division, reversal_r); /* 右側 */
	} else {
		/* 逆順 */
		strncpyr(s1 + n - division, s2, division, reversal_l); /* 左側 */
		strncpyr(s1, s2 + division, n - division, reversal_r); /* 右側 */
	}
	s1[n] = '\0';
}

int main(void) {
	int m; /* データセット数 */
	int l; /* 列車の長さ */
	char t[73]; /* 入場する列車の編成 */
	char u[40896][73]; /* 構成可能な最終編成 */
	int n; /* 構成可能な最終編成の数 */
	int i, j, k, h, g;

	if (scanf("%d", &m) != 1) return 1;

	/* データセット毎の処理 */
	for (i = 0; i < m; i++) {
		/* 初期化する */
		n = 0;
		/* 入場してくる列車の編成を入力する */
		scanf("%72s", t);
		l = strlen(t);

		/* 連結方法を全通り調べ重複を除いた総数を数える */
		for (j = 1; j < l; j++) { /* 分割位置 */
			for (k = 0; k < 2; k++) { /* 連結順 */
				for (h = 0; h < 2 * 2; h++) { /* 左側・右側の前後反転の有無 */
					/* 再編成する */
					rearrange(u[n], t, l, j, k, h / 2, h % 2);
					n++;

					/* これまでに作った編成と重複していないか調べる */
					for (g = 0; g < n - 1; g++) {
						if (strcmp(u[n - 1], u[g]) == 0) {
							n--;
							break;
						}
					}
				}
			}
		}

		/* 再編成の総数を出力する */
		printf("%d\n", n);
	}

    return 0;
}