标签:int .... cin 构造 char 详解 Messy 2009
\(其实有很多种构造方法,先说一下我的\)
\(因为有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调换位置可以多一个\)
标签:int,....,cin,构造,char,详解,Messy,2009 来源: https://www.cnblogs.com/iss-ue/p/12941232.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。