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调换位置可以多一个\)

posted @ 2020-05-23 09:58  倾叶子佮  阅读(142)  评论(0编辑  收藏  举报