题意:
给出一串长为 (n) 的由 ('(';) 和 (;')') 组成的括号序列。可以进行操作:选取一段子串,把该子串的顺序重新调整,使得每个括号都能匹配。一次操作的数量为子串的长度,求出使得整个串都能匹配的最少操作数,或判断不能达到要求。
数据范围:(1leq n leq 10^6)
分析:
栈,碰到右括号进栈,左括号出栈,如果最后栈不为空,输出 (-1) ,否则输出 (ans*2);
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+6;
char ss[N];
int main()
{
int n,ans=0,t=0;
scanf("%d",&n);
scanf("%s",ss+1);
for(int i=1;i<=n;i++)
{
if(ss[i]==')')
t++;
else
{
t--;
if(t>=0)
ans++;
}
}
if(t)
printf("-1
");
else
printf("%d
",2*ans);
return 0;
}