如果用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;
}