题意:给定一个正则括号序列 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 }