【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("\n"); } return 0; }