题目:https://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=1143
代码:
#include<cstdio>
#include<cstring>
using namespace std;
char a[20000],t[20000],c;//初始化数组,注意最多2万个珠子(初始1万+插入1万)
int len=0,n,p;
int Delete(int &pos)//根据插入位置删除,注意要改变pos对应的实参所以这里用了引用
{
int p1=pos,p2=pos;//定义左右指针
char key=a[pos];
while(p1>0&&a[p1]==key)p1--;//当p1>0且p1处元素等于关键字时,p1向左移动
if(p1||a[p1]!=key)p1++;
//当p1移动到非0处或者p1处元素不等于关键字,p1向右移动1次,这样为了使p2-p1=所求珠子数
while(p2<len&&a[p2]==key)p2++;//当p2<len且p2处元素等于关键字时,p2向右移动
if(p2-p1>=3)//当有3个及以上珠子相同
{
strcpy(t,a+p2);
strcpy(a+p1,t);//将从p2开始的字符串覆盖从p1开始的字符串
len-=(p2-p1);//字符串长度减去相同珠子数
pos=p1;//覆盖完后,下一次待比较位置在p1处
return 1;
}
return 0;
}
int main()
{
gets(a);
len=strlen(a);
scanf("%d",&n);
while(n--)
{
scanf("%d %c",&p,&c);
strcpy(t,a+p);
a[p]=c;len++;
strcpy(a+p+1,t);//覆盖以做到“删除”,注意长度+1
while(len&&Delete(p));
//当长度不为0且一直有3个及以上珠子相同,则继续执行,注意这里没有循环体
if(len)//若长度不为0,输出
puts(a);
else//反之,按要求输出,使用puts自带换行
puts("-");
}
return 0;
}