正解应该是求后缀和前缀
但是多情况讨论好像也能过。。
大概分为:
首先排除不能改的情况
1.改左括号
2.改右括号
/* 将一个位置的括号反过来,使原序列变成合法序列 */ #include<bits/stdc++.h> using namespace std; #define maxn 1000005 int n,cntl,cntr; char s[maxn]; int main(){ cin>>n>>(s+1); for(int i=1;i<=n;i++){ if(s[i]==')')cntr++; else cntl++; if(cntr-cntl>2 || n%2){ puts("0"); return 0; } } if(abs(cntl-cntr)!=2){ puts("0"); return 0; } int ans=0,l=0,r=0; if(cntl>cntr){ int tl=0,tr=0; for(int i=1;i<=n;i++){ if(s[i]==')')tr++; else tl++; if(tr>tl){ puts("0"); return 0; } } for(int i=n;i>=1;i--){ if(s[i]=='(')l++; else r++; if(l-r>0){ ans=l; break; } } } else { for(int i=1;i<=n;i++){ if(s[i]=='(')l++; else r++; if(r-l>0){ ans=r; break; } } } cout<<ans<<endl; }