牛客小白月赛87 D 小苯的IDE括号问题(hard)

news/2024/7/5 3:25:12

原题链接:D-小苯的IDE括号问题(hard)

题目大意:给定一个长度为n的字符串,字符串由(,)和I构成,m组询问,如果输入backspace,如果I左右是(和)就一起删除,如果是只有(就只删除左边。如果是delete就删除右边,如果右边存在。如果输入<-就把I向左移动,如果是->就把I向右移动。

思路:可以观察到每次操作都与I有关,并且题目里面涉及大量的删改,我的思路和题解不一样,是用数组来记录字符,然后用数组来模拟链表,这样可以快速的删除I左右的元素和移动I。官方的思路是用栈来存在I左边和右边的字符串,然后根据条件来操作,为了方便输出,栈可以用vector来模拟。

我的思路代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define endl '\n' 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=10007;
char p[N];
ll l[N],r[N];
int main()
{
    ios::sync_with_stdio(NULL);
	cin.tie(0),cout.tie(0);
	ll n,m;cin>>n>>m;
	ll cnt=0;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i];l[i]=i-1;r[i]=i+1;
		if(p[i]=='I')cnt=i;
	}
	r[0]=1;l[n+1]=n;
	while(m--)
	{
		if(r[0]>n)break;
		string s;cin>>s;
		if(s=="backspace")
		{
			ll a=l[cnt],b=cnt,c=r[cnt];
			if(a==0)continue;
			else if(c==n+1)
			{
				ll x=l[a];
				r[x]=b,l[b]=x;
			}
			else
			{
				if(p[a]=='('&&p[c]==')')
				{
					ll x=l[a],y=r[c];
					r[x]=b;l[b]=x;
					r[b]=y;l[y]=b;
				}
				else
				{
					ll x=l[a];
					r[x]=b;l[b]=x;
				}
			}
		}
		else if(s=="delete")
		{
			ll a=l[cnt],b=cnt,c=r[cnt];
			if(c==n+1)continue;
			else
			{
				ll x=r[c];
				l[x]=b;r[b]=x;
			}
		}
		else if(s=="<-")
		{
			ll a=l[cnt],b=cnt,c=r[cnt];
			if(a==0)continue;
			ll x=l[a];
			l[c]=a;r[a]=c;
			l[b]=x;r[b]=a;r[x]=b;l[a]=b;
		}
		if(s=="->")
		{
			ll a=l[cnt],b=cnt,c=r[cnt];
			if(c==n+1)continue;
			ll x=r[c];
			r[a]=c;l[c]=a;
			l[b]=c;r[b]=x;r[c]=b;l[x]=b;
		}
	}
		for(int i=r[0];i<=n;i=r[i])
		{
			cout<<p[i];
		}
		cout<<endl;
	return 0;
}

官方思路代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define endl '\n' 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=10007;
char p[N];
int main()
{
    ios::sync_with_stdio(NULL);
	cin.tie(0),cout.tie(0);
	ll n,m;cin>>n>>m;
	ll cnt=0;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i];
		if(p[i]=='I')cnt=i;
	}
    vector<char> a,b;
    for(int i=1;i<cnt;i++)a.push_back(p[i]);
    //exit(0);
    for(int i=n;i>cnt;i--)b.push_back(p[i]);
    while(m--)
    {
        string s;cin>>s;
        if(s=="backspace")
        {
            if(a.size())
            {
                if(b.size()&&b[b.size()-1]==')'&&a[a.size()-1]=='(')
                {
                    b.pop_back();
                }
                a.pop_back();
            }
        }
        if(s=="delete")
        {
            if(b.size())
            {
                b.pop_back();
            }
        }
        if(s=="<-")
        {
            if(a.size())
            {
                b.push_back(a[a.size()-1]);
                a.pop_back();
            }
        }
        if(s=="->")
        {
            if(b.size())
            {
                a.push_back(b[b.size()-1]);
                b.pop_back();
            }
        }
    }
    for(int i=0;i<a.size();i++)
    {
        cout<<a[i];
    }
    cout<<'I';
    for(int i=b.size()-1;i>=0;i--)
    {
        cout<<b[i];
    }
	return 0;
}


http://lihuaxi.xjx100.cn/news/2036060.html

相关文章

智能家居中可自行收集能量的无电池的无线设备

此图片来源于网络 1、背景 ZigBee是一种基于IEEE 802.15.4标准的低速短距离无线通信技术&#xff0c;用于创建个人区域网络。其名称来源于蜜蜂的八字舞&#xff0c;因为蜜蜂通过这种舞蹈来与同伴传递花粉的所在方位信息&#xff0c;从而构成了群体中的通信网络。ZigBee技术具…

ClickHouse 基础(一)

官网 以毫秒为单位查询数十亿行 ClickHouse是用于实时应用和分析的最快、资源效率最高的开源数据库。 安装ClickHouse 使用ClickHouse&#xff0c;你有三个选择: ClickHouse云:官方ClickHouse作为一项服务&#xff0c;-由ClickHouse的创建者构建&#xff0c;维护和支持快速安…

sensitive-word v0.13 特性版本发布 支持英文单词全词匹配

拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署&#xff1f; sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word 基于 DFA 算法实现的高性能敏感词工具介绍 更多技术交流 业务背景 对于英文单词 Disburse 之类的&#xff0c;其中的 sb 字母会被…

ElasticSearch之Index Template 和Dynamic Template

写在前面 在ElasticSearch之Mapping 一文中我们一起看了es的dynamic mapping机制&#xff0c;通过该机制允许我们不需要显式的定义mapping信息&#xff0c;而是es根据插入的文档值来自动生成 &#xff0c;比如插入如下的文档&#xff1a; {"firstName": "Chan…

Vue报错,xxx is defined #变量未定义

vue.js:5129 [Vue warn]: Error in v-on handler: "ReferenceError: count is not defined" 浏览器将这个变量 当做全局变量了&#xff0c;事实上它只是实例中的变量 加上this指定&#xff0c;是vue实例中的变量

使用php实现pc端和移动端分离

使用php实现pc端和移动端分离 自适应技术可以实现根据浏览器的宽度来实现移动端和pc的自适应&#xff0c;但会影响用户的体验&#xff0c;以下代码实现在同一个链接下&#xff0c;移动端和pc分别有各自的html&#xff0c; $browser get_browser(null, true);// 获取设备宽度$d…

数据库应用:kylin 部署 达梦数据库DM8

目录 一、实验 1.环境 2.部署前规划 3.部署达梦数据库DM8 4.创建数据库及数据库事例管理 5.达梦数据库的基本操作 二、问题 1.xhost命令报错 2.执行安装程序DMInstall.bin 报错 3.解压安装程序报错 4.安装程序找不到文件 5.图像化界面打不开 6.安装内存太小 7.打开…

C++常用算法

c常用算法介绍 类似python里面一些调用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 c常用算法介绍前言一、排序算法1.C sort()排序函数2.stable_sort() 函数3.partial_sort()函数4.nth_element()函数 二、使用…