Codeforces 363C. Fixing Typos

来源:互联网 发布:重庆宝钻资产管理 知乎 编辑:程序博客网 时间:2024/06/02 06:33
题意:
告诉你一个字符串,使得字符串满足下面条件:
1.一个串若结尾的两个字符相同,则这个串后面的两个字符不能相同。
2.不存在连续相同的三个字符。
求删除最少的字符,使得字符串满足上面条件。


解析:直接用栈来求解,
先往栈内压人前两个字母,因为前面的尽量不要删除,删除中间的,这样可以减少删除字母的次数。

依题意,有两种情况,当前字母无法入栈


1. 如果当前的字母和栈顶的栈顶的字母相同,且栈顶第二个字母和栈顶第三个字母相同。
2. 如果当前字母和栈顶字母相同,且栈顶第二个字母和栈顶相同。

最后将栈内的元素从头到尾输出就好了。

#include <cstdio>#include <cstring>using namespace std;const int N = 200010;char st[N];char str[N];int main() {char ch;while(scanf("%s",str) != EOF) {int top = 0;int len = strlen(str);st[top++] = str[0];st[top++] = str[1];for(int i = 2; i < len; i++) {ch = str[i];if((ch == st[top-1] && st[top-2] == st[top-3])|| ch == st[top-1] && st[top-1] == st[top-2]) {continue;}else {st[top] = ch;top++;}}st[top] = '\0';printf("%s\n",st);}return 0;}

0 0