codeforces C. Fixing Typos 解题报告

题目链接:http://codeforces.com/problemset/problem/363/C

题目意思:纠正两种类型的typos。第一种为同一个字母连续出现3次以上(包括3次);另一种为两个不同的字母各出现2次。需要把使用最少次数而纠正好的word输出来。

      为了方便操作,这里我都是通过删去后一个字母来纠正typo的,即如果是wwaattyy,假设看成两组:wwaa和ttyy,那么纠正完的分别是:wwa和tty。至于第一种类型的typo比第二种简便,只需要把同一个字母删除到只剩下2个即可。

      注意,这里的删去并不是真的删去,而是通过向应该删去的元素赋值,这里以字符'0'来处理。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 200000 + 10;
 8 char s[maxn];
 9 
10 int main()
11 {
12     int i, j, k, l, len, cnt1, cnt2;
13     while (gets(s))
14     {
15         len = strlen(s);
16         for (i = 0; i < len; i++)
17         {
18             cnt1 = 1;   //统计第一个字母的个数
19             j = i+1;
20             if (s[i] == s[j] && j < len)
21             {
22                 cnt1++;
23                 if (cnt1 == 2)  //相同字母有两个,后面有两种情况
24                 {
25                     //一:这个字母可能有>=3个,此时要删除到只剩下2个(以作标记作为删除)
26                     k = j+1;
27                     while (s[j] == s[k] && k < len) //第一类typo
28                     {
29                         s[k] = '0';  //删除到只剩下2个
30                         k++;
31                     }
32                     //二:第二类typo
33                     cnt2 = 1;
34                     l = k+1;
35                     if (s[k] == s[l] && l < len)
36                     {
37                         cnt2++;
38                         if (cnt2 == 2)  //删除到只剩下一个
39                         {
40                             s[l] = '0';
41                             while (s[k] == s[l+1] && l+1 < len)
42                             {
43                                 s[l+1] = '0';
44                                 l++;
45                             }
46                         }
47                     }
48                 }
49                 i = l-1;
50             }
51         }
52         for (i = 0; i < len; i++)
53         {
54             if (s[i] != '0')   //没有删去的输出
55                 printf("%c", s[i]);
56         }
57         printf("
");
58     }
59     return 0;
60 }
61             
原文地址:https://www.cnblogs.com/windysai/p/3438922.html