luogu1691_有重复元素的排列问题
时空限制 1000ms/128MB
题目描述
设R={r1,r2,……,rn}是要进行排列的n个元素。其中元素r1,r2,……,rn可能相同。使设计一个算法,列出R的所有不同排列。
给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
输入输出格式
输入格式:
第1行:元素个数n(1<=n<500)
第2行:一行字符串,待排列的n个元素
输出格式:
计算出的n个元素的所有不同排列,最后一行是排列总数。
输入输出样例
输入样例#1:
4 aacc
输出样例#1:
aacc acac acca caac caca ccaa 6
说明
输出按字典顺序排
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 505;
char s[N];
int n,a[30],len,tot;
void search(int k){
if (k==len){
tot++;
printf("%s\n",s);
return;
}
for (int i=0; i<26; i++)
if (a[i]){
s[k] = 'a'+i;
a[i]--;
search(k+1);
a[i]++;
}
}
int main(){
scanf("%d%s",&n,s);
len = strlen(s);
for (int i=0; i<len; i++) a[s[i]-'a']++; //桶排
search(0);
printf("%d\n",tot);
return 0;
}