zoukankan      html  css  js  c++  java
  • 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             
  • 相关阅读:
    中文转数字
    半角全角互转
    sql快速查记录数
    杀进程批处理
    线程基本用法
    sql游标用法示例
    BUGFREE的使用
    SQL常用函数
    ASP.NET 2.0 下的验证码控件
    经典sql语句
  • 原文地址:https://www.cnblogs.com/windysai/p/3438922.html
Copyright © 2011-2022 走看看