zoukankan      html  css  js  c++  java
  • 【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;
    }
    

      

  • 相关阅读:
    Mybatis的动态sql以及分页
    Mybatis入门
    使用java代码操作Redis
    Redis安装和基本操作
    idea安装以及使用
    卢卡斯定理 Lucas (p为素数)
    三分/优选法(黄金分割法)求单峰函数极值
    缩点tarjan
    tarjan 求割点
    tarjan
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5699406.html
Copyright © 2011-2022 走看看