您的位置:首页 > 其它

UOJ 31 [UR #2]猪猪侠再战括号序列

2016-09-15 14:46 232 查看
模拟

orz居然有大神用splay搞出来

下面的()括号表示题目中的左括号和右括号,挑战阅读能力

我的做法:记(值为1,)值为-1,从左到右不断累加。如果前i个括号是合法的括号序列,即累加值为0且累加值不出现负值,就直接不管前i个。对于每一个不合法的括号序列一定是以)为开头,此时累加值为-1,从这个位置向右不断累加,直到累加值为0,把这之间全部翻转就一定能形成合法序列。

#include<cstdio>
#include<cstring>
using namespace std;
char s[200005];
int ans[200005][2], pre[200005];
int main()
{
scanf("%s",s);
int n = strlen(s)-1, m=0;
for(int i = 0; i <= n; i++)
pre[i] = s[i] == '(' ? 1 : -1;
int pos=0, sum=0;
while(pos<=n)
{
sum+=pre[pos];
if(sum<0)
{
int temp=sum, des;
for(des = pos+1; temp; des++)
temp+=pre[des];
ans[++m][0]=pos+1;
ans[m][1]=des;
pos=des-1;
sum=0;
}
pos++;
}
printf("%d\n",m);
for(int i = 1; i <= m; i++)
printf("%d %d\n",ans[i][0],ans[i][1]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: