14-4 排列序數

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章