强迫症 | ||||||
| ||||||
Description | ||||||
众所周知,我们在使用网络聊天时如果在结尾加上一个括号会使语气变的十分有趣(。 但是这对于一位强迫症患者,xiaodao 队友Wangzhpp的下铺 wsc500而言,则是一件无法忍受的事情 —— Wangzhpp给他发送的消息中又有一大堆没有被匹配起来的括号!善良的xiaodao决定帮助他将这一大坨括号完美地匹配起来。 已知消息是一个由n个左括号“(”与n个右括号“)”所组成的括号序列,xiaodao需要使用不超过n次操作将所给的括号序列变为一个完美匹配的括号序列。 每次操作,xiaodao可以指定一个区间[l,r],将其中的所有括号反序。如“()(()”在进行操作后会变为“)(()(”。 | ||||||
Input | ||||||
第一行一个整数 T ,代表有 T 组数据。 每组数据仅一行,包含一个如上所述的括号序列。 (括号序列的长度 2 <= 2n <= 100000) | ||||||
Output | ||||||
对于每组数据, 第一行输出一个整数m(m<=n),代表xiaodao的操作次数。 接下来m行,每行输出两个整数l, r(l<=r),代表xiaodao这一次对区间[l,r]内的序列进行了操作。 | ||||||
Sample Input | ||||||
2 )()()( )(())( | ||||||
Sample Output | ||||||
1 1 6 2 1 2 5 6 | ||||||
Hint | ||||||
只需要构造一个合法解而非最优解。 | ||||||
Source | ||||||
"诚德软件杯"哈尔滨理工大学第四届ACM程序设计团队赛 |
思路:既然是题目保证了有n个左括号和n个右括号,辣么不难想到,因为是逆序放置,只要使得左边的括号全是左括号,右边的括号全是右括号即可,辣么操作就是这样滴:
在左半边遍历,如果遇到了右括号,就在后边找左括号,如果找到了左括号,加入答案数组中,然后别忘记使得左括号变成右括号。
AC代码:
#include<stdio.h>
#include<string.h>
using namespace std;
char a[200000];
int ans[200000][2];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",a+1);
int n=strlen(a+1);
int cont=0;int p=0;
for(int i=1;i<=n/2;i++)
{
if(a[i]==')')
{
while(p<i||a[p]==')')p++;
a[p]=')';
ans[cont][0]=i;
ans[cont][1]=p;
cont++;
}
}
printf("%d\n",cont);
for(int i=0;i<cont;i++)
{
printf("%d %d\n",ans[i][0],ans[i][1]);
}
}
}