- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
#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;
}