XTU1154:Encode

来源:互联网 发布:otl功率放大器实验数据 编辑:程序博客网 时间:2024/06/06 04:51

题目描述

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

输入

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

输出

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

样例输入

4aabbaaaaaaaaaazzzzzzzzz

样例输出

202100e000f919

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


0 0
原创粉丝点击