给你一个 n 和一个 k,再给你一个由括号组成的字符串,告诉你括号的数量一定是成对的。 你可以有若干次操作,数量不限,把字符串中的一段倒置。 问你如何操作能使字符串配成 k 个“正则括号”,即括号能组合成 k个整体。例如:()()()k等于 3 ;(()()())k等于 1 ;(()())()k等于 2 。
构造一个答案,然后如果原串和答案串不一样就往后找到第一个一样的,把这一段倒置,感觉很暴力的写法。。
int main() { int t;cin>>t; while(t--) { int n,k;cin>>n>>k; string s,v=""; cin>>s; rep(i,k-1) v+="()"; int yu=(n-(int)v.size())/2; rep(i,yu) v+="("; rep(i,yu) v+=")"; vector<pii >ans; rep(i,n) { if(s[i]!=v[i]) { for(int j=i+1;j<n;++j) { if(s[j]==v[i]) { ans.push_back(make_pair(i+1,j+1)); reverse(s.begin()+i,s.begin()+j+1); break; } } } } cout<<ans.size()<<endl; for(auto x: ans) cout<<x.first<<" "<<x.second<<endl; } //stop; return 0; }