字典序问题

来源:互联网 发布:odps sql 参考手册 编辑:程序博客网 时间:2024/05/22 03:08

问题描述:

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。

字母表中共有26个字母{a,b,…,z},这些特殊的单词长度不超过6且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。
例如:
a→1    b→2    z→26    ab→27    ac→28

你的任务就是对于所给的单词,求出它的编码。单词长度不超过6.


#include <fstream>#include <ctime>#include <iostream>#include <string>using namespace std;ifstream fin("input.txt");ofstream fout("output.txt");clock_t start,finish;double total_time;int combination(int a, int b) //计算C(a,b) 组合数{if (b == 0 || a == b){return 1;}int denominator = 1, numerator = 1;for (int i = b; i > 0; i--){numerator *= a--;//分子denominator *= b--;//分母}return numerator/denominator;}int caculateNum(string str)//计算字符串字典序编号{int num = 0;int step = 1;int last = str.length() - 1;             //指向最后的字母int pre_last = str.length() - 2;         //指向倒数第二个字母if (str.length() == 1)                   //如果长度为1,直接计算,返回编码{return (str.at(0) - 'a' + 1);}num += str.at(last) - str.at(pre_last);  //先计算倒数第一个和倒数第二个字母决定的能放置的串个数,比如abdg  d 和 g之间决定 dg之前最近两串 abde abdfwhile(pre_last > 0)                      //没有到达字符串的首字母处{pre_last--;                          //last pre_last 同时向前移动一个单位last--;for (int i = 0; i < (str.at(last) - str.at(pre_last)) - 1; i++ ){num += combination('z'-str.at(pre_last) - 2 -i,step);  //计算移动后,last 和 pre_last之间存在的串数}                                                          //abde   bd 之间 step++;}if (str.at(0) != 'a'){                                                              //计算同等数位,第一个字母之前的串数for (int i = 0;i < str.at(0) - 'a'; i++){num += combination(25 - i,step);}}for (int i = str.length() - 1; i > 0; i--)                    //计算小于str位数的串数{num += combination(26,i);}return num;}int main(){start = clock();string str;while(fin>>str){fout<<caculateNum(str)<<"\n";}finish = clock();total_time = (double)(finish - start);fout<<total_time<<" s";return 0;}


原创粉丝点击