Sicily 2371. Show Me The Fax

2371. Show Me The Fax

Constraints

Time Limit: 1 secs, Memory Limit: 256 MB

Description

Fax machines use a form of compression based on run-length encoding. Run-length encoding (RLE) is a very simple form of data compression in which runs of data (that is, sequences in which the same data value occurs in many consecutive data elements) are stored as a single data value and count, rather than as the original run. This is most useful on data that contains many such runs: for example, relatively simple graphic images such as icons, text, and line drawings. It is not useful with files that don't have many runs as it could potentially double the file size (photograph, for example).
For this problem, you will write a program that decodes a block of data using a very simple RLE algorithm. A run is encoded using a two byte sequence. The first byte of the sequence contains the count, and the second contains the value to repeat. The count is encoded using an 8 bit value with the high order bit set to 1. The remaining 7 bits represent the count-3. This gives a maximum run count of 130 per 2 byte sequence. (This implies that the minimum run count is 3). Bytes that are not part of a run are encoded as-is with a prefix byte indicating the count of bytes in the non-run minus 1, 0 through 127, representing a range of 1 - 128 (the high order bit will always be 0 in the case of non-run data).

Input

The first line of input contains a single integer P, (1$ \le$P$ \le$1000), which is the number of data sets that follow. Each data set consists of multiple lines. The first line contains two (2) decimal integer values: the problem number, followed by a space, followed by the number of bytes B, (1$ \le$B$ \le$5000), to decode. The remaining line(s) contain(s) the data to be decoded. Each line of data to decode contains 80 hexadecimal digits (except the last line, which may contain less). 2 hexadecimal digits are used to represent each byte. Hexadecimal digits are: 0123456789ABCDEF

Output

For each data set, there are multiple lines of output. The first line contains a decimal integer giving the data set number followed by a single space, followed by a decimal integer giving the total number of decoded bytes. The remaining lines contain the decoded data, 80 hexadecimal digits per line, except the last line which may contain less.

Sample Input

4 
1 2 
0007 
2 4 
00F481A5 
3 32 
850080FF016666825A0A717273747580080110111384550301020399807700CC 
4 2 
A568

Sample Output

1 1 
07 
2 5 
F4A5A5A5A5 
3 44 
0000000000000000FFFFFF66665A5A5A5A5A71727374758008011011135555555555555501020399 
777777CC 
4 40 
68686868686868686868686868686868686868686868686868686868686868686868686868686868
很水,题目意思是编码有重复和不重复的两种,对于前者,考虑两个byte,也就是4个16进制数字,前两个是次数,后两个是内容,对于不重复,算出不重复的次数n,然后后面的n个内容都不重复,也就是2n个数字,判断重复与否就看换成2进制之后的第一位。

输出比较坑爹,没多想,用两次调用,不过效率就不高了

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

string code;
int b_counter;
int p_num;
int b_num;
bool is_cal;

inline int char_to_int(char temp) {
    if ('0' <= temp && temp <= '9') {
        return temp - '0';
    } else {
        return temp - 'A' + 10;
    }
}

void decode() {
    int line_counter = 0;
    int hex[8];
    for (int i = 0; code[i] != '\0'; ) {
        int h = char_to_int(code[i]), l = char_to_int(code[i + 1]);
        for (int j = 3; j >= 0; j--) {
            hex[j] = h % 2;
            hex[j + 4] = l % 2;
            h /= 2;
            l /= 2;
        }
        if (hex[0] == 0) { //non-run
            int sum = 0;
            for (int k = 7; k >= 1; k--) {
                sum = sum + hex[k] * (int)pow((double)2, (double)(7 - k));
            }
            sum = sum + 1;
            if (is_cal) {
                b_counter += sum;
            } else {
                for (int k = i + 2; k < i + 2 + 2 * sum; k++) {
                    cout << code[k];
                    line_counter++;
                    if (line_counter == 80) {
                        line_counter = 0;
                        cout << endl;
                    }
                }
            }
            i = i + 2 + 2 * sum;
        } else {
            int sum = 0;
            for (int k = 7; k >= 1; k--) {
                sum = sum + hex[k] * (int)pow((double)2, (double)(7 - k));
            }
            sum = sum + 3;
            if (is_cal) {
                b_counter += sum;
            } else {
                for (int k = 0; k < sum; k++) {
                    cout << code[i + 2] << code[i + 3];
                    line_counter += 2;
                    if (line_counter == 80) {
                        line_counter = 0;
                        cout << endl;
                    }
                }
            }
            i = i + 4;
        }
    }
    if (is_cal) {
        cout << p_num << " " << b_counter << endl;
    } else if (line_counter) {
        cout << endl;
    }
}

int main() {
    int case_num;
    cin >> case_num;
    for (int case_counter = 1; case_counter <= case_num; case_counter++) {
        is_cal = true;
        b_counter = 0;
        cin >> p_num >> b_num;
        int lines = b_num % 40 ? b_num / 40 + 1 : b_num / 40;
        string temp;
        code.clear();
        for (int lines_counter = 0; lines_counter < lines; lines_counter++) {
            cin >> temp;
            code += temp;
        }
        decode();
        is_cal = false;
        decode();
    }
    return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值