题目链接: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("\n"); 58 } 59 return 0; 60 } 61