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