按字典序输出含有重复元素的字符串的全排列

这是做到的一道题
输入的每个字符串都是由小写字母组成的
对于输出是:输出输入字符串产生的所有排列,不能有重复的排列,而且按字典序输出,且每一种排列占一行。在每组连续的测试数据间输出空行。
测试了几组数据好像都是对的,但就是WA,不知道错在哪里了,下面是代码,各位可以帮忙看看吗?感激不尽!

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int maxn = 1010;
char a[maxn];
bool flag = true;

int factorial(int n)
{
    int fact = 1;
    for(int i = 1; i <= n; i++)
    {
        fact = fact * i;
    }
    return fact;
}
void next_per(int n)
{
    int temp1 = -1, temp2 = -1;
    char min = 123;
    flag = true; 

    for(int i = n-2; i>=0; i--)
    {
        if(a[i] < a[i+1])
        {
            temp1 = i;
            break;
        }
    }
    if(temp1 == -1)
    {
        flag = false;
        return; 
    }
    for(int i = temp1 +1; i<n; i++)
    {
        if(a[i] > a[temp1] && a[i] < min)
        {
            temp2 = i;
            min = a[i];
        }   
    }
    swap(a[temp1],a[temp2]);
    sort(a+temp1+1,a+n);
}

int main()
{
    int cas, n;
    scanf("%d",&cas);

    while(cas)
    {
        scanf("%s",a);  
        n = strlen(a);  
        sort(a,a+n);    
        int fact = factorial(n);
        for(int i = 1; i<=fact; i++)
        {
            if(flag == true)
                printf("%s\n",a);
            next_per(n);
        }
        flag = true; 
        cas--;
        if(cas)
            printf("\n");

    }
    return 0;
}

http://blog.csdn.net/say_it/article/details/45342187