//将问题分解为:每个数据都依次放在第一位置,问题变为,n-1个数据的排列问题,
//再将n-1中每个数据依次放在次位,问题变为,n-2个数据的排列问题,依次递归下去,直到p等于q,递归出口,数据的组合输出。
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string str; //定义全局字符串str;
void swap(int x, int y) {//交换字符串中x,y位置的字符;
char temp = str[x];
str[x] = str[y];
str[y] = temp;
}
void func(int i, int j) {//递归函数
if (i == j) { //递归出口
for (int m = 0; m < str.size(); ++m) {
cout << str[m];
}
cout << endl;
}
else {
for (int m = i; m < str.size(); ++m) {
string s = str; //先把str保存起来
swap(i, m);
sort(str.begin() + i+1, str.end()); //确定前面的字符后 把后面的字符串排序 比如abcd 当把ac交换后变成cbad,有了这一步会变成cabd。除了第一个a,后面的变得有序;
func(i + 1, j);//下一层递归
str = s; //递归结束后把str复原
}
}
}
int main() {
int n;
cin >> str;
sort(str.begin(), str.end());//先统一排序
n = str.size();
func(0, n - 1);
}