题意:给你n个仅包括“(” 和 ")"的字符串,让你从这些字符串中进行两两组合,使得两个串组成一个串之后,所组成的括号序列是correct的
我们先把每一个字符串简化,例如 ()(())( 把成对的消去即为 (,然后我们消去后有四种情况
①空串
②只有(
③只有)
④))))…(((
显然,①可以与①两两配对,相同数量的②和③可以配对,④无论如何也不能配对
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<string.h>
#define ll long long
#define inf 0x3f3f3f
using namespace std;
const int maxn=5e5+5;
int m[2][maxn];
void cal(string s)
{
stack<char> st;
int y=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='(')
st.push('(');
else
{
if(st.empty())
y++;
else st.pop();
}
}
if(y==0)
{
int size=st.size();
if(size==0)
m[0][0]++;
else m[0][size]++;
}
else
{
int size=st.size();
if(size==0)
m[1][y]++;
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string s;
cin>>s;
cal(s);
}
int cnt=0;
for(int i=1;i<maxn;i++)
cnt+=min(m[0][i],m[1][i]);
cnt+=m[0][0]/2;
cout<<cnt;
return 0;
}