编码问题

题目

有一种编码的编码范围是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

分析

屏幕快照 2016-09-10 下午8.44.11
如上图,把编码树画出来,确定每一层节点的子树的节点数,逐层往下走,叠加编码串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;
}
posted @ 2016-09-10 20:57  苏苏苏紫Sue  阅读(752)  评论(0编辑  收藏  举报