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;
}

 

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