Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:
Correct parentheses sequences can be defined recursively as follows:
1.The empty string "" is a correct sequence.
2.If "X" and "Y" are correct sequences, then "XY" (the concatenation of X and Y) is a correct sequence.
3.If "X" is a correct sequence, then "(X)" is a correct sequence.
Each correct parentheses sequence can be derived using the above rules.
Examples of correct parentheses sequences include "", "()", "()()()", "(()())", and "(((())))".
Now Yuta has a parentheses sequence S , and he wants Rikka to choose two different position i,j and swap Si,Sj .
Rikka likes correct parentheses sequence. So she wants to know if she can change S to a correct parentheses sequence after this operation.
It is too difficult for Rikka. Can you help her?
Correct parentheses sequences can be defined recursively as follows:
1.The empty string "" is a correct sequence.
2.If "X" and "Y" are correct sequences, then "XY" (the concatenation of X and Y) is a correct sequence.
3.If "X" is a correct sequence, then "(X)" is a correct sequence.
Each correct parentheses sequence can be derived using the above rules.
Examples of correct parentheses sequences include "", "()", "()()()", "(()())", and "(((())))".
Now Yuta has a parentheses sequence S , and he wants Rikka to choose two different position i,j and swap Si,Sj .
Rikka likes correct parentheses sequence. So she wants to know if she can change S to a correct parentheses sequence after this operation.
It is too difficult for Rikka. Can you help her?
Input
The first line contains a number t(1<=t<=1000), the number of the testcases. And there are no more then 10 testcases with n>100
For each testcase, the first line contains an integers n(1<=n<=100000), the length of S. And the second line contains a string of length S which only contains ‘(’ and ‘)’.
For each testcase, the first line contains an integers n(1<=n<=100000), the length of S. And the second line contains a string of length S which only contains ‘(’ and ‘)’.
Output
For each testcase, print "Yes" or "No" in a line.
Sample Input
3 4 ())( 4 ()() 6 )))(((
Sample Output
Yes Yes NoHintFor the second sample input, Rikka can choose (1,3) or (2,4) to swap. But do nothing is not allowed.
题意:
给你一个只含有'('和')'的字符串问是否能让这个字符串交换两个字符后括号匹配?
分析:
思路简单,从左到右第一个富裕的 ) 和从右到左第一个富裕的 ( 交换。然后判断是否匹配就可以了。注意这里有个问题就是假如字符串原本括号就是匹配的。如果要在交换一次。这里有个规律吧。如果字符串长度>2那么一定存在一种交换方法能够使得交换后依然可以匹配。
这个题目细节很多。很容易wa.
代码:
#include <stdio.h>
#include <string.h>
int pre[100010],later[100010];
char str[100010];
int gethash(char c)
{
if(c == '(') return 1;
return -1;
}
int main()
{
int t,n,l,r;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
scanf("%s",str+1);
n = strlen(str+1);
int flag = 0;
l = -1,r = n;
for(int i = 1 ; i <= n ; i ++)
flag += gethash(str[i]);
if(flag != 0)
{
printf("No\n");
continue;
}
for(int i = 1 ; i <= n ; i ++)
{
pre[i] = pre[i-1] + gethash(str[i]);
if(pre[i] < 0)
{
l = i;
break;
}
}
if(l == -1 )
{
if(n > 2) //排除掉 () 为 No 这组数据
printf("Yes\n");
else
printf("No\n");
continue;
}
later[n+1] = 0;
for(int i = n ; i >= 1 ; i --)
{
later[i] = later[i+1] + gethash(str[i]);
if(later[i] > 0)
{
r = i;
break;
}
}
if( r <= l )
{
printf("No\n");
continue;
}
char c = str[l];
str[l] = str[r];
str[r] = c;
for(int i = 1 ; i <= n ; i ++)
{
pre[i] = pre[i-1] + gethash(str[i]);
if(pre[i] < 0)
{
printf("No\n");
break;
}
if(i == n) printf("Yes\n");
}
}
return 0;
}
Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:
Correct parentheses sequences can be defined recursively as follows:
1.The empty string "" is a correct sequence.
2.If "X" and "Y" are correct sequences, then "XY" (the concatenation of X and Y) is a correct sequence.
3.If "X" is a correct sequence, then "(X)" is a correct sequence.
Each correct parentheses sequence can be derived using the above rules.
Examples of correct parentheses sequences include "", "()", "()()()", "(()())", and "(((())))".
Now Yuta has a parentheses sequence S , and he wants Rikka to choose two different position i,j and swap Si,Sj .
Rikka likes correct parentheses sequence. So she wants to know if she can change S to a correct parentheses sequence after this operation.
It is too difficult for Rikka. Can you help her?
Correct parentheses sequences can be defined recursively as follows:
1.The empty string "" is a correct sequence.
2.If "X" and "Y" are correct sequences, then "XY" (the concatenation of X and Y) is a correct sequence.
3.If "X" is a correct sequence, then "(X)" is a correct sequence.
Each correct parentheses sequence can be derived using the above rules.
Examples of correct parentheses sequences include "", "()", "()()()", "(()())", and "(((())))".
Now Yuta has a parentheses sequence S , and he wants Rikka to choose two different position i,j and swap Si,Sj .
Rikka likes correct parentheses sequence. So she wants to know if she can change S to a correct parentheses sequence after this operation.
It is too difficult for Rikka. Can you help her?
Input
The first line contains a number t(1<=t<=1000), the number of the testcases. And there are no more then 10 testcases with n>100
For each testcase, the first line contains an integers n(1<=n<=100000), the length of S. And the second line contains a string of length S which only contains ‘(’ and ‘)’.
For each testcase, the first line contains an integers n(1<=n<=100000), the length of S. And the second line contains a string of length S which only contains ‘(’ and ‘)’.
Output
For each testcase, print "Yes" or "No" in a line.
Sample Input
3 4 ())( 4 ()() 6 )))(((
Sample Output
Yes Yes NoHintFor the second sample input, Rikka can choose (1,3) or (2,4) to swap. But do nothing is not allowed.
Author
学军中学