CodeSky 代码之空

随手记录自己的学习过程

SMU 算法题 情书的编码

2014-06-10 14:29分类: C评论: 0

题目: 截获了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)