题意

test20181024 hao_模拟
test20181024 hao_ios_02

分析

考场10分

直接\(O(nm)\)模拟即可。

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#include<cassert>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read()
{
    T data=0;
	int w=1;
    char ch=getchar();
    while(!isdigit(ch))
    {
		if(ch=='-')
			w=-1;
		ch=getchar();
	}
    while(isdigit(ch))
        data=10*data+ch-'0',ch=getchar();
    return data*w;
}
template<class T> il T read(T&x)
{
	return x=read<T>();
}
typedef long long ll;
const int INF=0x7fffffff;

const int MAXN=3e3+7;
int len;
char s[MAXN];

bool check(int k,int&l,int&r)
{
	l=r=k;
	while(l-1>=0&&s[l-1]==s[l])
		--l;
	while(r+1<len&&s[r+1]==s[r])
		++r;
	return r-l+1>=3;
}

void del(int l,int r)
{
	len-=r-l+1;
	for(int i=l;i<len;++i)
	{
		s[i]=s[i+r-l+1];
	}
	s[len]=0;
}

int main()
{
  freopen("hao.in","r",stdin);
  freopen("hao.out","w",stdout);
	scanf("%s",s);
	len=strlen(s);
	int n=read<int>();
	int k;
	char z[2];
	while(n--)
	{
		read(k);
		scanf("%s",z);
		for(int i=len;i>k;--i)
			s[i]=s[i-1];
		s[k]=z[0];
		s[++len]=0;
		int l,r;
		while(check(k,l,r))
		{
			del(l,r);
			k=l-1;
		}
		if(len>0)
			puts(s);
		else
			puts("-");
	}
//  fclose(stdin);
//  fclose(stdout);
    return 0;
}

标解

为何只有10分呢?

是因为这题有潜规则。

输入中会出现大于等于3个相同的子串,并且如果AAABBCCC中间插一个B进去,原串变为AAA。

还有就是原始串会有空串。(我不知道祖玛游戏没有珠子还要怎么玩。)

输入数据规模只有\(10^3\),可以说随便怎么暴力都是能过的。直接用vector::insert/erase,循环删除直到不能删这种程度的暴力都没有问题。

这道题来自于THU数据结构课程的作业,原题数据规模是\(10^4\),需要使用list和由插入点向两边删除的策略以尽量减少操作数才能通过。

于是我改了两个地方就AC了。

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#include<cassert>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read()
{
    T data=0;
	int w=1;
    char ch=getchar();
    while(!isdigit(ch))
    {
		if(ch=='-')
			w=-1;
		ch=getchar();
	}
    while(isdigit(ch))
        data=10*data+ch-'0',ch=getchar();
    return data*w;
}
template<class T> il T read(T&x)
{
	return x=read<T>();
}
typedef long long ll;
const int INF=0x7fffffff;

const int MAXN=3e3+7;
int len;
char s[MAXN];

bool check(int k,int&l,int&r)
{
	l=r=k;
	while(l-1>=0&&s[l-1]==s[l])
		--l;
	while(r+1<len&&s[r+1]==s[r])
		++r;
	return r-l+1>=3;
}

void del(int l,int r)
{
	len-=r-l+1;
	for(int i=l;i<len;++i)
	{
		s[i]=s[i+r-l+1];
	}
	s[len]=0;
}

int main()
{
  freopen("hao.in","r",stdin);
  freopen("hao.out","w",stdout);
	fgets(s,MAXN,stdin); // edit 1
	len=strlen(s);
	s[--len]=0;
	int n=read<int>();
	int k;
	char z[2];
	while(n--)
	{
		read(k);
		scanf("%s",z);
		for(int i=len;i>k;--i)
			s[i]=s[i-1];
		s[k]=z[0];
		s[++len]=0;
		int l,r;
		while(check(k,l,r))
		{
			del(l,r);
			k=l; // edit 2
		}
		if(len>0)
			puts(s);
		else
			puts("-");
	}
//  fclose(stdin);
//  fclose(stdout);
    return 0;
}