赞
踩
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。