给你一个 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;
} 
京公网安备 11010502036488号