トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

2006db1.c

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

//n両編成の場合、前後の分割はn-1通り。
//それぞれ、前の正・逆と後ろの正・逆で4通り、前と後ろで2通り、で8通り
//全部の組み合わせを作ってみる?

#define MAXS 100
#define MAX 10000

// 組み合わせを覚えておく配列
char kumi[MAX][MAXS];
int ct;

void add(char *s)
{
	int i;
	
	// これまでの組み合わせに同じものがないかチェック
	for(i=0; i<ct; i++){
		if(!strcmp(kumi[i], s)){
			break;
		}
	}
	// 同じものがなかったら追加
	if(i==ct){
//		printf("(%d) ", ct);
		strcpy(kumi[ct],s);
		ct++;
	}
}

main()
{
	int m,i,j,k,l,p;
	char t[MAXS],u[MAXS];
	// 前の正順、前の逆順、後ろの正順、後ろの逆順
	char f1[MAXS],f2[MAXS],b1[MAXS],b2[MAXS];
	
	fgets(t, MAXS, stdin);
	m=atoi(t);
	
	
	for(i=0; i<m; i++){
		// 電車の組み合わせをクリア
		for(j=0; j<MAX; j++){
			strcpy(kumi[j],"");
		}
		ct=0;
		
		fgets(t, MAXS, stdin);
		t[strlen(t)-1]='\0'; // 改行文字を消す
		
		l=strlen(t);
		//printf("\n*%s (%d)\n", t, l);
		// j:前後の分割位置
		for(j=1; j<=l-1; j++){
			// 前
			p=0;
			for(k=0; k<j; k++){
				f1[p]=t[k];
				f2[p]=t[j-k-1];
				p++;
			}
			f1[p]='\0';
			f2[p]='\0';
			// 後
			p=0;
			for( ; k<l; k++){
				b1[p]=t[k];
				b2[p]=t[l-k-1+j];
				p++;
			}
			b1[p]='\0';
			b2[p]='\0';
			//printf("f1:%s f2:%s b1:%s b2:%s\n", f1, f2, b1, b2);
			
			sprintf(u,"%s%s",f1,b1);
			//printf("%s ", u);
			add(u);
			sprintf(u,"%s%s",f1,b2);
			//printf("%s ", u);
			add(u);
			sprintf(u,"%s%s",f2,b1);
			//printf("%s ", u);
			add(u);
			sprintf(u,"%s%s",f2,b2);
			//printf("%s ", u);
			add(u);
			sprintf(u,"%s%s",b1,f1);
			//printf("%s ", u);
			add(u);
			sprintf(u,"%s%s",b1,f2);
			//printf("%s ", u);
			add(u);
			sprintf(u,"%s%s",b2,f1);
			//printf("%s ", u);
			add(u);
			sprintf(u,"%s%s",b2,f2);
			//printf("%s\n", u);
		}
		//puts("---");
		//for(j=0; j<ct; j++){
		//	printf("%s ", kumi[j]);
		//}
		//printf("\n");
		
		printf("%d\n", ct);
	}
	
	return 0;
}