• 2016湖南省赛----G


    2016湖南省赛----G - Parenthesis (括号匹配)
     
    Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions.
    The i-th question is whether P remains balanced after p ai and p bi  swapped. Note that questions are individual so that they have no affect on others.
    Parenthesis sequence S is balanced if and only if:
    1. S is empty;
    2. or there exists balanced parenthesis sequence A,B such that S=AB;
    3. or there exists balanced parenthesis sequence S' such that S=(S').

    Input

    The input contains at most 30 sets. For each set:
    The first line contains two integers n,q (2≤n≤10 5,1≤q≤10 5).
    The second line contains n characters p 1 p 2…p n.
    The i-th of the last q lines contains 2 integers a i,b i (1≤a i,b i≤n,a i≠b i).

    Output

    For each question, output " Yes" if P remains balanced, or " No" otherwise.

    Sample Input

    4 2
    (())
    1 3
    2 3
    2 1
    ()
    1 2

    Sample Output

    No
    Yes
    No

    題意: 给出一个已经匹配的括号序列,任意的交换两个位置的括号,判断是否匹配,如果匹配输出 Yes 不匹配输出 No。

    输入一个n一个m,n表示括号序列的长度,m代表下面给出m种交换方式,对每一种方式进行判断。

    思路:

      可将该问题分为三类:

                1. 若交换的两个位置的括号相同 则可直接输出 Yes;

                2.若后面的左括号与前面的右括号交换,则可直接输出Yes. 因为一开始是平衡串,  如果左边的字符')'与右边的'('交换,那么此时交换的两个必能匹配为一对。

                3.若后面的右括号与前面的左括号交换,则可根据括号匹配问题进行判断.

    代码实现:

    #include <iostream>
    #include <string.h>
    #include <string>
    #include <stdio.h>
    #include <algorithm>
    #include <stdio.h>
    #include <stack>
    using namespace std;
    
    
    char s1[300000]={0};
    
    
    int main(){
        int n,m;
        while(~scanf("%d%d",&n,&m)){
                getchar();
                scanf("%s",s1);
                int a,b;
                for(int i=1;i<=m;i++){
                    char c;
                    scanf("%d%d",&a,&b);
                    if(a>b)
                        swap(a,b);
                    if(s1[a-1]==s1[b-1]||s1[b-1]=='('){                   //第一种情况与第二种情况
                      printf("Yes
    ");
                      continue;
                    }
                    swap(s1[a-1],s1[b-1]);
                    int sum = 0;
                    for(int i = 0;i<n;i++){                                          //  第三种情况的判断
                        if(s1[i]=='(')
                            sum++;
                        if(s1[i]==')')
                            sum--;
                        if(sum<0)
                            break;
                    }
                    if(sum==0)
                        printf("Yes
    ");
                    else
                        printf("No
    ");
                    swap(s1[a-1],s1[b-1]);                                    //将字符串还原
                }
        }
        return 0;
    }
  • 相关阅读:
    Java学习8.17
    Java学习8.16
    Java学习8.15
    Java学习8.14
    Java学习8.13
    Java学习8.12
    Java学习8.11
    131. Palindrome Partitioning 回文串分割
    40. Combination Sum II 不允许使用重复元素
    39. Combination Sum 凑出一个和,可以重复用元素(含duplicates)
  • 原文地址:https://www.cnblogs.com/LGJC1314/p/6714934.html
Copyright © 2020-2023  润新知