Rikka with Parenthesis II

来源:互联网 发布:淘宝帐号俩个手机登陆 编辑:程序博客网 时间:2024/05/14 06:13

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");    }}
0 0
原创粉丝点击