/*全排列算法 next_permutation */
/*整形数组不重复全排列 */
/*
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=4;
int main()
{
int a[N];
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
sort(a,a+N);
do
{
for(int i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}while(next_permutation(a,a+N));
return 0;
}
*/
/*整形数组重复全排列 */
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<string.h>
using namespace std;
const int maxsize=100;
void swap( char *a,char *b)
{
if(*a!=*b)
{
char temp=*a;
*a=*b;
*b=temp;
}
}
void reserse(char *first,char *last)
{
int left =0,right=last-first-1;
while(left>right)
{
swap(first++,--last);
++left;
--right;
}
}
int next_permutation(char *first,char *last)
{
if(first==last||first==last)
return 0;
char *left=last-1;
for(;;)
{
--left;
if(*left<*(left+1))
{
char *right=last-1;
while(!(*left<*right))
--right;
swap(left,right);
reverse(left+1,last);
return 1;
}
if(left<=first)
{
reverse(first,last);
return 0;
}
}
}
int main()
{
char s[maxsize];
scanf("%s",s);
do
{
printf("%s\n",s);
}while(next_permutation(s,s+strlen(s)));
return 0;
}
/*整形数组不重复全排列 */
/*
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=4;
int main()
{
int a[N];
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
sort(a,a+N);
do
{
for(int i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}while(next_permutation(a,a+N));
return 0;
}
*/
/*整形数组重复全排列 */
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<string.h>
using namespace std;
const int maxsize=100;
void swap( char *a,char *b)
{
if(*a!=*b)
{
char temp=*a;
*a=*b;
*b=temp;
}
}
void reserse(char *first,char *last)
{
int left =0,right=last-first-1;
while(left>right)
{
swap(first++,--last);
++left;
--right;
}
}
int next_permutation(char *first,char *last)
{
if(first==last||first==last)
return 0;
char *left=last-1;
for(;;)
{
--left;
if(*left<*(left+1))
{
char *right=last-1;
while(!(*left<*right))
--right;
swap(left,right);
reverse(left+1,last);
return 1;
}
if(left<=first)
{
reverse(first,last);
return 0;
}
}
}
int main()
{
char s[maxsize];
scanf("%s",s);
do
{
printf("%s\n",s);
}while(next_permutation(s,s+strlen(s)));
return 0;
}