行程編碼是一種常見的無損壓縮方式。比如針對于純英文小寫字符我們可以按以下方式進行編碼:每個字節的低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
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; }
XTU1154:Encode,布布扣,bubuko.com
原文地址:http://blog.csdn.net/libin56842/article/details/25837485