编码问题
题目
有一种编码的编码范围是a~y的25个字母,从1位到4位的编码,从1位到4位的编码,如果把该编码按照字典序排序,形成一个数组如下
a,aa,aaa,aaab,...b,ba,baa,baaa,baab,...,yyyw,yyyx,yyyy
其中a的Index为0.要求求某个编码的Index。
输入:baca
输出:16331
分析

如上图,把编码树画出来,确定每一层节点的子树的节点数,逐层往下走,叠加编码串c0c1c2c3中每一个字符ci同级的节点的所有孩子,以及同级的节点即可
比如编码aaba。
记result为aaba的位置(从1开始)
- 对于c0,无兄长节点,因此,只需加上同级节点(节点a),result变为1
- 对于c1,无兄长节点,因此,只需加上同级节点(节点a),result变为2
- 对于c2
- 有一个兄长节点,result加上其孩子数,result = result + 25 = 27
- 只需加上同级节点,result = result + 2 = 29
- 对于c3,最后一级,只需加上同级节点。result = result + 1 = 30;
从1开始数的话,aaba是第30个编码,也就是Index为29.
源程序
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
template<typename T>
void Print(T *data,int len)
{
for(int i = 0;i < len;++ i)
cout << data[i] << ",";
cout << endl;
}
int Fun(const string& str)
{
//subnodes[i]表示下标为i的的字符所在节点对应的子节点数。abcd中c的下标为2.当它作为父节点时,共有25个孩子
//subnodes = {16275,650,25,0}
int subnodes[4] = {0};
for(int i = 2;i >= 0;-- i)
subnodes[i] = subnodes[i + 1] * 25 + 25;
//Print(subnodes,4);
int len = str.size();
int result = 0;
for(int i = 0;i < len;++ i)
{
//加上兄长节点的所有孩子
result += subnodes[i] * (str[i] - 'a');
//加上兄长节点以及自身
result += str[i] - 'a' + 1;
}
return result - 1;
}
int main()
{
string str;
while(cin >> str)
{
if(str.size() > 4)
break;
cout << Fun(str) << endl;
}
return 0;
}
内心柔软,技术要强硬。