(其实有很多种构造方法,先说一下我的)
(因为有k个子串是合法表达式,所以我们先在最前面构造)
(k-1个(),然后后面都放(,放完了就结束,因为后面都是))
(所以大概构造后是这样的()()()()()....(((((((((....))))))))))
(至于前面k-1个就两个两个判断,如果不是()的形式就去后面交换)
#include <bits/stdc++.h>
using namespace std;
#define p(a,b) make_pair(a,b)
char s[2009],temp[2009];
int find(char w,int q)
{
for(int i=q;i<=strlen(s+1);i++)
if(s[i]!=w) return i;
return -1;
}
void reverse(int l,int r)
{
for(int i=l;i<=r;i++) temp[i]=s[i];
for(int i=l;i<=r;i++) s[i]=temp[r-(i-l)];
}
typedef pair<int,int>ss;
vector<ss>vec;
int main()
{
int t,n,k;
cin>>t;
while(t--)
{
cin>>n>>k>>(s+1);
for(int i=1;i<=k-1;i++)
{
int now=1+(i-1)*2;
if(s[now]=='(')//直接翻转
{
if(s[now+1]==')') continue;
else
{
int last=find(s[now+1],now+2);
reverse(now+1,last);
vec.push_back(p(now+1,last));
}
}
else//先变成'('再去反转
{
int last=find(s[now],now+1);
reverse(now,last);
vec.push_back(p(now,last));
if(s[now+1]==')') continue;
else
{
last=find(s[now+1],now+2);
vec.push_back(p(now+1,last));
reverse(now+1,last);
}
}
}
for(int i=1+2*(k-1);i<=strlen(s+1);i++)
{
if(s[i]=='(') continue;
int last=find(s[i],i+1);
if(last==-1) break;
reverse(i,last);
vec.push_back(p(i,last));
}
cout<<vec.size()<<endl;
for(int i=0;i<vec.size();i++)
cout<<vec[i].first<<" "<<vec[i].second<<endl;
vec.clear();
}
}
(另一种思路(其实大致相同))
(先构造成((()))形式)
(这样就有1个合法串,还需要k-1个)
(把2和4调换位置可以多一个)
(3和5调换位置可以多一个)