如果用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个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
【输入格式】
一行,一个串。
【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
例如:
输入:
bdca
程序应该输出:
11
再例如:
输入:
cedab
程序应该输出:
70
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
这题长度为10的时候就是一坑,可以用长度为9的全排列生成为10的序号映射。暂时没写,先骗分
#include <bits/stdc++.h>
#include<ctime>
using namespace std;
int main()
{
map<string,int>mp;
int tol=0;
char a[10]= {'a','b','c','d','e','f','g','h','i','j'};
string s;
cin>>s;
if(s.length()<=9){
clock_t start_time=clock();
for(int i=1; i<=9; i++)
{
string tmp;
tol=0;
do
{
tmp="";
for(int j=0;j<i;j++)tmp+=a[j];
mp[tmp]=tol;
tol++;
}
while(next_permutation(a,a+i));
}
clock_t end_time=clock();
cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<<endl;//输出运行时间
}
else {
//更优的算法
}
cout<<mp[s]<<endl;
return 0;
}