【CF1023C】Bracket Subsequence(模拟)

题意:给定一个正则括号序列 s ,让你在当中选择一个长度正好为 t 的子串,使得 t 恰好也是一个正则括号序列

思路:用栈模拟

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 typedef long long ll;
13 typedef unsigned int uint;
14 typedef unsigned long long ull;
15 typedef pair<int,int> PII;
16 typedef vector<int> VI;
17 #define fi first
18 #define se second 
19 #define MP make_pair
20 #define N   210000
21 #define MOD 1000000007
22 #define eps 1e-8 
23 #define pi acos(-1)
24 #define oo 2000000000
25 
26 
27 char a[N];
28 int stk[N],flag[N];
29 
30 int read()
31 { 
32    int v=0,f=1;
33    char c=getchar();
34    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
35    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
36    return v*f;
37 }
38 
39 void swap(int &x,int &y)
40 {
41     int t=x;x=y;y=t;
42 }
43 
44 
45 
46 int main()
47 {
48 //    freopen("1.in","r",stdin);
49     //freopen("1.out","w",stdout);
50     int n,k;
51     scanf("%d%d",&n,&k);
52 //    printf("%d%d",n,k);
53     scanf("%s",a);
54 //    printf("%s",a);
55     int cnt=0;
56     int top=0;
57     for(int i=0;i<=n-1;i++)
58     {
59         if(a[i]=='('&&cnt<(k/2)) {stk[++top]=i; cnt++;}
60          else
61          {
62              if(a[i]==')'&&top>0)
63              {  
64                  flag[i]=1;
65                 flag[stk[top--]]=1;
66             } 
67          }
68     }
69     for(int i=0;i<=n-1;i++)
70      if(flag[i]) printf("%c",a[i]); 
71      
72     return 0;
73 }
原文地址:https://www.cnblogs.com/myx12345/p/9843785.html