C. Messy(构造详解)

(其实有很多种构造方法,先说一下我的)

(因为有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调换位置可以多一个)