SMU 算法题 情书的编码
题目: 截获了Bobwu的检讨以后,Linkinpaoger突然想到可以用自己的加密方式来加密情书。Linkinpaoger写了一封给Anonymous的情书并加密,然后发现密文中出现了很多类似ABBCCC的字符串。经过思索,Linkinpaoger决定按以下规则压缩密文:
1.任何包含k个相同字符的子串被替换为kX,X表示该子串中的唯一字符。
2.若某个这样的子串长度为1,那么省略‘1’。
按以上规则,ABBCCC将被压缩为A2B3C。现在请你帮Linkinpaoger压缩密文。
输入:
输入的第一行为一个正整数N,表示共有N组测试数据,接下来的每一行表示一组密文,密文仅由‘A'-’Z'组成。
1≤N≤100,每组密文的长度不超过10000个字符长度。
输出:
对于每组输入数据,输出一行压缩后的密文。
样例输入:
2 ABC ABBCCC
样例输出:
ABC A2B3C
绞尽脑汁写了个很渣的代码:
1#include <stdio.h>
2#include <stdlib.h>
3
4int main(void)
5{
6 int i, n, counter = 1, j;
7 char str[100][10000], *p, *q, *t, num[1000], temp;
8
9 scanf("%d", &n);
10 getchar();
11
12 for (i = 0; i < n; i++) {
13 j = 0;
14 while ((str[i][j++] = getchar()) != '\n')
15 ;
16 str[i][j - 1] = '\0';
17 p = str[i];
18 q = str[i];
19 while (*p)
20 {
21 if (*p == *(p + 1)) {
22 counter++; // 计数:有多少个重复字母
23 }
24 else
25 {
26 temp = *p; // 临时变量储存现在的字母
27
28 if (counter > 1) {
29 sprintf(num, "%d", counter); // 规定格式:存在字符数组里
30 t = num;
31 while (*t) {
32 *(q++) = *(t++);
33 }
34 }
35 *(q++) = temp;
36 counter = 1;
37 }
38 p++;
39 }
40 *(q++) = '\0';
41 }
42
43 for (i = 0; i < n; i++)
44 puts(str[i]);
45
46 return 0;
47}
48
当时没写完这篇文章 也算了吧 仅供参考。
评论 (0)