题意:要求你从只含有()的字符串中删除一些使得剩下的字符串不会有成括号的情况。
思路:从左边开始找(,从右边开始找),优先匹配,不行则停止。
#include<bits/stdc++.h> using namespace std; const int maxn=10005; int sum1[maxn],sum2[maxn]; char s1[maxn]; int ans1[maxn]; int main() { int n,i,j,t; cin>>(s1+1); for(i=1;i<strlen(s1+1);i++) { if(s1[i]=='(') sum1[i]=sum1[i-1]+1,sum2[i]=sum2[i-1]; else sum2[i]=sum2[i-1]+1,sum1[i]=sum1[i-1]; } int l=1,r=strlen(s1+1),ans=0,idx=0,cnt=0,flag=0; while(l<=r) { if(flag==0) { if(s1[l]=='(') { flag=l; } l++; } else { if(s1[r]==')') { ans1[cnt++]=flag; ans1[cnt++]=r; ans++; flag=0; } r--; } //cout<<l<<" "<<r<<" "<<flag<<" "<<ans<<endl; } if(ans>0) { cout<<1<<endl<<2*ans<<endl; sort(ans1,ans1+cnt); for(i=0;i<cnt;i++) cout<<ans1[i]<<" "; cout<<endl; } else cout<<0<<endl; return 0; }