【链接】
【题意】在这里输入题意
【题解】
我们贪心地把每一个括号序列能匹配都按照栈的规则都匹配出来。 (直接递增匹配对数*2就可以了 最后栈里面就只剩下类似))))(((((((这样的形式了。 现在就相当于有很多个这种字符串了。 让你把它们拼接在一起。 可以用sort贪心一下。 优先把(多的序列放在前面一点。 具体的比较函数这么写 里注释的括号用于参考 (实在不知道原理,就一种一种猜吧。。。。 sort完之后再模拟一下括号匹配就好
bool operator < (const abc &b) const{ //))))((((( ((((( if (left_brackets>right_brackets){ //))(((((((((((((( if (b.left_brackets>b.right_brackets) return right_bracketsb.left_brackets; }else{ //)))))(((((((((((((( return false; //如果这个左括号那么多的话,就放左边去吧。 } } }
【代码】
#include#define LL long long#define rep1(i,a,b) for (int i = a;i <= b;i++)#define rep2(i,a,b) for (int i = a;i >= b;i--)#define all(x) x.begin(),x.end()#define pb push_back#define lson l,mid,rt<<1#define rei(x) scanf("%d",&x)#define rel(x) scanf("%lld",&x)#define res(x) scanf("%s",x)#define rson mid+1,r,rt<<1|1using namespace std;const double pi = acos(-1);const int dx[4] = {0,0,1,-1};const int dy[4] = {1,-1,0,0};const int N = 1e5;struct abc{ int right_brackets,left_brackets; //))))))))(( //))((((((((((( bool operator < (const abc &b) const{ //))))((((( ((((( if (left_brackets>right_brackets){ //))(((((((((((((( if (b.left_brackets>b.right_brackets) return right_brackets b.left_brackets; }else{ return false; } } }}a[N+10];int n;char s[N+10];int sta[N+10];int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif int T; rei(T); while(T--){ long long ans = 0; rei(n); for (int i = 1;i <= n;i++){ a[i].left_brackets = a[i].right_brackets = 0; res(s); int len = strlen(s); int top = 0; for (int j = 0;j < len;j++) if (s[j]==')'){ if (top>0 && sta[top]==0){ top--; ans+=2; }else sta[++top] = 1; }else{ sta[++top] = 0; } rep1(j,1,top) if (sta[j]==1) a[i].right_brackets++; else a[i].left_brackets++; } sort(a+1,a+1+n); int now = 0; rep1(i,1,n){ int temp = min(now,a[i].right_brackets); now-=temp; ans+=(temp*2); now+=a[i].left_brackets; } printf("%lld\n",ans); } return 0;}