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

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

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

// 並べ替え結果処理
void kekka_shori(char *p)
{
    int i;
    // 重複チェック
    for (i = 0; i < res_i; i++)
        if (0 == strcmp(res_d[i], p))
            return;
    // 重複無ければ蓄える
    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;

    // 初期化
    res_i = 0;
    // 並べ替えデータ作成(重複チェック)
    narabe(d, strlen(d));
    // 表示
    for (i = 0; i < res_i; i++) {
        printf("%s\n", res_d[i]);
    }

    return 0;
}