トップ 一覧 Farm 検索 ヘルプ 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;
 }