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

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

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

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

我的思路代码:

#pragma GCC optimize(2)
#include
#define endl '\n' 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair 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<

官方思路代码:

#pragma GCC optimize(2)
#include
#define endl '\n' 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair 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 a,b;
    for(int i=1;icnt;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=0;i--)
    {
        cout<

你可能感兴趣的:(算法,数据结构,c++)