• test20181024 hao


    题意


    分析

    考场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;
    }
    
    静渊以有谋,疏通而知事。
  • 相关阅读:
    Java 零基础跑起第一个程序
    Xcode6 引入第三方静态库project的方法
    Cocos2d-x3.0 RenderTexture(三)
    POJ 题目3461 Oulipo(KMP)
    unity3D游戏开发实战原创视频讲座系列9之塔防类游戏开发第一季
    android 虚拟按键是通过哪种机制上报的?
    深入理解 C 指针阅读笔记 -- 第五章
    【1】按照Django官网,编写一个web app 创建project/配置数据库
    [Swift]LeetCode442. 数组中重复的数据 | Find All Duplicates in an Array
    [Swift]LeetCode441. 排列硬币 | Arranging Coins
  • 原文地址:https://www.cnblogs.com/autoint/p/9845541.html
Copyright © 2020-2023  润新知