// http://i...content-available-to-author-only...e.com/amccIr
//  並べ替え
//  重複非表示

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

char res_d[4 * 3 * 2 * 1][5];   // 結果貯蔵
int res_i;                      // 結果個数

// 並べ替え結果処理
void kekka_shori(char *p)
{
    strcpy(res_d[res_i++], p);  // 蓄える
}

// 文字列の右n桁を左にスライド
void narabe(char *d, int n)
{
    int i, j, len = strlen(d);
    char c;

    if (n <= 1) {
        kekka_shori(d);
        return;
    }
    for (j = 0; j < n; j++) {
        narabe(d, n - 1);
        c = d[len - n];
        for (i = 0; i < n - 1; i++)
            d[len - n + i] = d[len - n + i + 1];
        d[len - n + i] = c;
    }
}

int main()
{
    char d[] = "aabc";
    int i, j;

    res_i = 0;
    narabe(d, strlen(d));
    for (i = 0; i < res_i; i++) {
        for (j = 0; j < i; j++)
            if (0 == strcmp(res_d[i], res_d[j]))
                break;
        if (j >= i)
            printf("%s\n", res_d[i]);
    }

    return 0;
}
