1. 排列序数
Description
如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
...
现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
Input
一行,一个串。
Output
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
Samples
Input 复制
bdca
Output
11
Input 复制
cedab
Output
70
#include<bits/stdc++.h>
using namespace std;
long long m,n,b,c,d,e,i,j,k,s,t;
int main(){
string s,ss;
cin>>s;
ss=s;
sort(s.begin(),s.end());
while(ss!=s){
next_permutation(s.begin(),s.end());
k++;
}
cout<<k;
return 0;
}
2.稍大的串
Description
串可以按照字典序进行比较。例如:
abcd 小于 abdc
如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些。科学地说:它是大于已知串的所有串中最小的串。你的任务就是求出这个“稍大的串”。
Samples
Input 复制
abfxy
Output
abfyx
Input 复制
ayyyxxff
Output
fafxxyyy
Hint
数据规模约定:
输入的串不超过1000个字符。
特例:
如果已知的串已经是所有重组串中最大的,则原样输出读入的那个串。
#include<bits/stdc++.h>
using namespace std;
long long m,n,b,c,d,e,i,j,k,t;
int main() {
string s;
cin >> s;
next_permutation(s.begin(), s.end());
cout<<s;
return 0;
}