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;
}
posted @ 2021-11-08 22:36  Coros_Trusds  阅读(161)  评论(0)    收藏  举报