题解 CF1452C 【Two Brackets】

less than 1 minute read

Published:

一个显然的结论,当我们可以同时删去多个合法的括号匹配的时候,分多次删除一定更优。同时,当我们删去一些合法的括号匹配时,不会改变剩下的括号匹配的合法性。因此,找出所有的合法括号匹配即可。

#include<bits/stdc++.h>
#define re register
#define ll long long
#define LL inline ll
#define I inline int
#define V inline void
#define B inline bool
#define FOR(i,a,b) for(re int i=(a),i##i=(b);i<=i##i;++i)
#define ROF(i,a,b) for(re int i=(a),i##i=(b);i>=i##i;--i)
#define gc getchar()
using namespace std;
const int N=2e5+10;
LL read(){
	ll p=0; bool w=0; char ch=gc;
	while(!isdigit(ch)) w=ch=='-'?1:0,ch=gc;
	while(isdigit(ch)) p=p*10+ch-'0',ch=gc;
	return w?-p:p;
}
int T,len,ans,s,t;
char ch[N];
int main(){
	T=read();
	while(T--){
		scanf("%s",ch);
		len=strlen(ch),ans=0,s=0,t=0;
		FOR(i,0,len-1){
			if(ch[i]=='(') ++s;
			else if(ch[i]==')'&&s) --s,++ans;
			if(ch[i]=='[') ++t;
			else if(ch[i]==']'&&t) --t,++ans;
		}
		cout<<ans<<endl;
	}
	
	return 0;
}