清华OJ:PA 1-2祖玛(Zuma)顺序表方案

题目: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;
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/82707861
PA1
pa
今日推荐