AT2586 [ABC064D] Insertion
题目大意
给你一个只有 ( 和 ) 的字符串,请你把这个字符串补全,即让每一个 ( 都和 ) 配对。
题目分析
发现性质:
\(\boxed{\texttt{1.任何一个答案数列都是在原数列的左右两侧添加括号。}}\)
\(\boxed{\texttt{2.左边添加的一定为 `(`,右边添加的一定为 `)`。}}\)
于是好办了,我们用 \(lft\) 表示需要在左边加几个 (,用 \(rgt\) 表示需要在右边加几个 )。
至于统计 \(lft\) 和 \(rgt\),就按括号序列的套路来即可:
定义一个栈 \(st\),
如果当前字符是 ( 则打入 \(1\);
如果当前字符是 ),若栈不为空,则弹出栈顶;否则则 \(lgt\gets lgt+1\),表示栈空了,括号不匹配了,加一个 ( 吧。
\(rgt\) 即为匹配结束时栈内元素的个数。也很好理解:栈内还有元素(如果没有则不输出),这些都是没找到另一半的 (,于是我们手动配对即可。
代码
const int ma=105;
char str[ma];
stack<int>st;
int main(void)
{
int n=read();
scanf("%s",str+1);
int l(0),r(0);
for(register int i=1;i<=n;i++)
{
char now=str[i];
if(now=='(')
{
st.push(1);
}
else
{
if(!st.empty())
{
st.pop();
}
else
{
l++;
}
}
}
r=st.size();
while(l--)
{
printf("(");
}
printf("%s",str+1);
while(r--)
{
printf(")");
}
return 0;
}

浙公网安备 33010602011771号