【bzoj1561】[JSOI2009]去括号

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define maxn 100001
 
using namespace std;
 
char s[maxn];
bool w[maxn];
int S[maxn],n,top,tt,T;
 
bool pd(int l,int r)
{
    for (int i=l;i<=r;i++)
    {
        if (s[i]=='(' && !w[i])
            tt++;
        if (s[i]==')' && !w[i]) 
            tt--;
        if (!tt && (s[i]=='+' || s[i]=='-')) 
            return 0;
    }
    return 1;
}
 
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        memset(s,0,sizeof(s));
        memset(w,0,sizeof(w));
        memset(S,0,sizeof(S));
        scanf("%s",s+1);
        n=strlen(s+1);
        for (int i=1,nn;i<=n;i++)
        {
            if (s[i]=='(') 
                S[++top]=i;
            else if (s[i]==')')
            {
                nn=S[top--];
                if (s[nn-1]=='/'||s[nn-1]=='*'||s[i+1]=='*'||s[i+1]=='/')
                {
                    if (pd(nn+1,i-1))
                    {
                        w[nn]=w[i]=1;
                        if (s[nn-1]=='/')
                        {
                            for (int j=nn+1;j<i;j++)
                            {
                                if (s[j]=='(' && !w[j]) 
                                    tt++;
                                if (s[j]==')' && !w[j]) 
                                    tt--;
                                if (!tt)
                                {
                                    if (s[j]=='*') 
                                        s[j]='/';
                                    else if (s[j]=='/') 
                                        s[j]='*';
                                }
                            }
                        }
                    }
                }
                else
                {
                    w[nn]=w[i]=1;
                    if (s[nn-1]=='-')
                        for (int j=nn+1;j<i;j++)
                        {
                            if (s[j]=='(' && !w[j])
                                tt++;
                            if (s[j]==')' && !w[j]) 
                                tt--;
                            if (!tt)
                            {
                                if (s[j]=='+')
                                    s[j]='-';
                                else if (s[j]=='-')
                                    s[j]='+';
                            }
                        }
                }
            }
        }
        for (int i=1;i<=n;i++) 
            if (!w[i]) 
                printf("%c",s[i]);
        printf("
");
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/yangjiyuan/p/5699406.html