首页 > 代码库 > XTU1154:Encode

XTU1154:Encode

题目描述

行程编码是一种常见的无损压缩方式。比如针对于纯英文小写字符我们可以按以下方式进行编码:每个字节的低5位表示英文小写字母的序号(从0到25),高3位表示此字母连续的次数-1(0到7依次表示连续1到8次)。比如说一个字节的二进制为00100001,其表示字符串bb。给你一个字符串,试将字符串编码为对应的行程编码,并将编码字节的16进制输出。

输入

第一行是一个整数K,表示样例的个数。以后每行是一个待编码的小写英文字母组成的字符串,其长度不超过1000个字符。

输出

每行输出一个编码的16进制数码串(10~15使用a~f表示)。

样例输入

4
aabb
a
aaaaaaaaa
zzzzzzzzz

样例输出

2021
00
e000
f919


Source

XTUCPC2013



#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

char str[1005];
int hash[10] = {0,0,32,64,96,128,160,192,224};
int len;

void change(int s)
{
    int s1,s2;
    s1 = s/16;
    s2 = s%16;
    if(s1>=0 && s1<=9)
        printf("%d",s1);
    else
        printf("%c",s1-10+‘a‘);
    if(s2>=0 && s2<=9)
        printf("%d",s2);
    else
        printf("%c",s2-10+‘a‘);
}

void solve(int word,int cnt)
{
    int sum = 0;
    while(cnt>8)
    {
        sum = hash[8]+word;
        change(sum);
        cnt-=8;
    }
    if(cnt)
    {
        sum = hash[cnt]+word;
        change(sum);
    }
}

int main()
{
    int t,i,j,cnt,word;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",str);
        len = strlen(str);
        word = str[0]-‘a‘;
        cnt = 1;
        for(i = 1; i<len; i++)
        {
            if(str[i] == word+‘a‘)
                cnt++;
            else
            {
                solve(word,cnt);
                word = str[i]-‘a‘;
                cnt = 1;
            }
        }
        solve(word,cnt);
        printf("\n");
    }

    return 0;
}