题目

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。

解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。

本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

输入格式:

输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过1000个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过1MB。

输出格式:

根据要求压缩或解压字符串,并在一行中输出结果。

输入样例 1:

C
TTTTThhiiiis isssss a tesssst CAaaa as

输出样例 1:

5T2h4is i5s a3 te4st CA3a as

输入样例 2:

D
5T2h4is i5s a3 te4st CA3a as10Z

输出样例 2:

TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ

分析:

遇到D解压时, 设计数初始值为0,遇到数字就本身乘10再加新的该数;不是数字就输出计数次数的当前数,如果不为0则输出相应次数,如果为0输出一次,输出后计数再次初始为0。
遇到C压缩时,设置计数初始值为1,设置当前字符的前一个字符pre,每次比较pre与当前字符是否相等,不相等就输出数字和当前字符。之所以从1开始,因为比如有三个相等的字符,pre与当前字符只能比较两次
最后…蜜汁bug:
最开始我用的scanf(“%c\n”,&t); 录入C or D,测试点2格式有问题,测试点3答案错误。
改了无数次,最后把这句输入改成 cin>>t;getchar() 就过了….(还不知道什么原理,留坑)

代码(cpp):

#include<iostream>
using namespace std;
int main(){
    char option;
    char ergodic;
    cin>>option;
    getchar();
    if(option=='D'){
        int num=0;
        while(scanf("%c",&ergodic)==1 && ergodic!='\n'){
            if(ergodic >='0' && ergodic <='9'){
                num = num*10 + ergodic-'0';
            }else{
                for(int i=0;i<num;i++)
                    cout<<ergodic;
                if(!num)
                    cout<<ergodic;
                num=0;
            }
        }
    }else{
        int num=1;
        char previous;
        scanf("%c",&ergodic);
        previous = ergodic;
        while(scanf("%c",&ergodic)==1 && ergodic!='\n'){
            if(ergodic == previous)
                num++;
            else{
                if(num>=2)
                    cout<<num;
                cout<<previous;
                num=1;
                previous = ergodic;
            }
        }
        if(num>=2)
            cout<<num;
        cout<<previous;
    }
    return 0;
}