2.4 Encoding
2.4.1 时空限制
Time limit: 1 Seconds Memory limit: 32768K
2.4.2 题目内容
Given a string containing only “A” – “Z”, we could encode it using the following method:
(1) Each sub-string containing k same characters should be encoded to “kX ” where “X ” is the only character in this sub-string.
(2) If the length of the sub-string is 1, “1” should be ignored.
Input
The first line contains an integer N (1≤N ≤100) which indicates the number of test cases. The next N lines contain N strings. Each string consists of only “A” – “Z” and the length is less than 100.
Output
For each test case, output the encoded string in a line.
Sample Input
2
ABC
ABBCCC
Sample Output
ABC
A2B3C
2.4.3 题目来源
Zhejiang Provincial Programming Contest 2005 (Author: ZHANG, Zheng)
2.4.4 汉语翻译
1.题目
编 码
给定一个只包含“A”~“Z”的字符串,我们使用下面的方法给它编码:
(1)将子字符串中的 k 个相同字符写成“kX ”,X 是子串中的字符。
(2)如果子串的长度是 1,那么“1”要忽略。
2.输入描述
第一行包含一个正整数 N(1≤N≤100),代表测试案例的个数。下面 N 行包含 N 个字符串。每个字符串仅包含“A”~“Z”,且字符串的长度小于 100。
3.输出描述
对于每个测试案例,输出它的编码在单独一行上。
4.输入描述
2
ABC
ABBCCC
5.输出描述
ABC
A2B3C
2.4.5 解题思路
本题是作一种简单的编码,把一个字符串中连续重复的字母从左到右写成 kX 的形式,如果 k 是 1,那么,1 就要省略。
本题的考察重点是对连续重复字符的处理,这种处理是字符串处理中常考的技巧。
由于 ACM 的判题系统只会比对输出结果的形式是否与要求的一致,不会考虑数据类型,所以,不要先把编码全部完成后一次性输出,而是要一边计算,一边输出结果,这点很重要。
4.4.6 参考答案
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string s,t;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
int c=0;
t=s[0];
int temp=0;
for(int j=0;j<s.size();j++)
{
if(s[j]==t[0])
{
temp++;
//如果已是最后一个,直接输出
if(j==s.size()-1)
{
if(temp==1)cout<<t[0];
else cout<<temp<<t[0];
}
}
else
{
if(temp==1)cout<<t[0];
else cout<<temp<<t[0];
t[0]=s[j];
temp=1;
//如果已是最后一个,直接输出
if(j==s.size()-1)
{
if(temp==1)cout<<t[0];
else cout<<temp<<t[0];
}
}
}
cout<<endl;
}
return 0;
}