1. 程式人生 > >2016湖南省省賽G題

2016湖南省省賽G題

                                       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). OutputFor 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

題解:就是一個括號配對問題。

下面附上程式碼:

#include<stdio.h>
#include<algorithm>
#include<stack>
using namespace std;
char str[100005];
int main()
{
    int n, m;
    while(~scanf("%d%d", &n, &m))
    {
        scanf("%s", str+1);
        int a, b;
        for(int i = 1; i <= m; i++)
        {
            scanf("%d%d", &a, &b);
            if(a>b) swap(a,b);
            if(str[b]=='(' || str[a] == str[b])//這個地方不加前面的str[b]=='(',就會超時。
            {
                printf("Yes\n");
                continue;
            }
            swap(str[a], str[b]);
            int ans = 0;
            for(int i = 1; i <= n; i++)
            {

                if(str[i] == '(') ans++;
                else ans--;
                if(ans < 0) { printf("No\n"); break;}
            }
            if(ans == 0) printf("Yes\n");
            swap(str[a], str[b]);
        }
    }
    return 0;
}