n个元素有n!个不同的排列。
将这n!个不同的排列按字典序排列,并编号为0,1,2,…,n!-1。现在给定n个元素及一个排列,求这个序列的字典序值,
和字典序排列的下一个排列。
样例输入
8 2 6 4 5 8 1 7 3
样例输出
8227 2 6 4 5 8 3 1 7
代码如下
#include<stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char a[20][3];
int n;
long long jiecheng(int n){
long long result=1;
for(long long i=2;i<=n;i++){
result=result*i;
}
return result;
}
long long f(){
long long result=0;
for(long long i=1;i<n;i++){
long long sum=0;
for(int j=i+1;j<=n;j++){
if(strcmp(a[j],a[i])<0){
sum++;
}
}
result=result+(jiecheng(n-i))*sum;
}
return result;
}
int main(){
scanf("%d ",&n);
for(int i=1;i<=n;i++){
scanf("%s",&a[i]);
if(a[i][1]=='\0'){
a[i][1]=a[i][0];
a[i][0]='0';
}
}
printf("%lld\n",f());
for(int i=n-1;i>=1;i--){
if(strcmp(a[i],a[i+1])<0){
char b[3];
int index=-1;
strcpy(b,a[i+1]);
for(int j=i+2;j<=n;j++){
if(strcmp(a[j],b)<0 && strcmp(a[j],a[i])>0){
strcpy(b,a[j]);
index=j;
}
}
char temp[3];
if(index!=-1){
strcpy(temp,a[index]);
strcpy(a[index],a[i]);
strcpy(a[i],temp);
}else{
strcpy(temp,a[i+1]);
strcpy(a[i+1],a[i]);
strcpy(a[i],temp);
}
for(int k=i+1;k<n;k++){
for(int q=i+1;q<n;q++){
if(strcmp(a[q],a[q+1])>0){
strcpy(temp,a[q]);
strcpy(a[q],a[q+1]);
strcpy(a[q+1],temp);
}
}
}
break;
}
}
for(int i=1;i<=n;i++){
if(a[i][2]=='\0' && a[i][0]=='0'){
printf("%c ",a[i][1]);
}
else{
printf("%s ",a[i]);
}
}
return 0;
}