您的位置:首页 > 其它

Rikka with Parenthesis II

2016-08-24 10:58 405 查看

Rikka with Parenthesis II



.

.

题意:给定一个由“(”,“)”组成的序列,看交换其中两个位置的符号使得序列合法(一定要交换)。

.

.

解法:弄一个队列如果出现相邻的()就出队,然后记录有多少种不合法的情况,比如队列开头为),那么就把这个替换成(,并记录有一个不合法,如果最终队列不为空且最后为(,那么替换成)并记录。最后如果恰好只有两个或没有不合法那么就可以了。注意特判一下长度为2的“()”这种情况就好了。

.

.

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

const int maxn = 100010;
char c[maxn];
int n, m, correct, l, r;

int main() {
//freopen("a.in","r",stdin);
int tt;
scanf("%d", &tt);
while (tt--) {
scanf("%d", &n);
m = 0;
correct = 0;
l = 0;
r = 0;
for (int i = 1; i <= n; i++) {
m++;
cin >> c[m];
if (c[m] == '(') l++;
if (c[m] == ')') r++;
if (m == 1 && c[m] == ')') {
correct++;
c[m] = '(';
}
while (m >= 2 && c[m] == ')' && c[m-1] == '(' ) {
m = m-2;
}
}
if (m > 0) {
c[m] = ')';
correct++;
}
while (m >= 2 && c[m] == ')' && c[m-1] == '(' ) {
m = m-2;
}
if (l != r) {
printf("No\n");
continue;
}
if (l == 1 && correct == 0) {
printf("No\n");
continue;
}
if (correct != 0 && correct != 2) {
printf("No\n");
continue;
}
if (m > 0) {
printf("No\n");
continue;
}
printf("Yes\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: