题目链接

分析:

卡常数~~~好气啊~~~这是看脸的时代啊~~~

$A$代表$($的数量,$B$代表$)$的数量...

如果$($的数量多于$)$的数量,那么最有方案显然是添加$A-B$个$)$...反之亦然...

因为这两种情况的处理方法差不多,所以我们假定$A>B$...

因为是有循环位移操作的,所以我们我们证明一定存在一种添加方案可以使得循环位移之后在最后添加$A-B$个$)$并且字典序最小...

证明如下:

我们把$($设为$+1)$设为$-1$,那么合法的序列就是每个位置的前缀和都$>=0$,那么我们考虑找到最后一个坏点(也就是不合法的点),然后把这个位置到最后的字符全部移到前面,这样就满足了前缀没有坏点,然后对于后面的坏点我们递归进行...

那么如何找到字典序最小的满足要求的原串排列,考虑是循环位移,所以我们倍增字符串,那么一个合法的排列就是某个后缀的长度$n$的前缀,因为要字典序最小,所以我们通过后缀数组来解决...我们找到每个后缀,判断是否合法,怎么判断自己YY吧,有益身心健康~~~

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std; const int maxn=4000000+5; int n,len,gs[maxn],sa[maxn],wb[maxn],wv[maxn],ran[maxn],sum[maxn],pre[maxn],suf[maxn]; char s[maxn],ans[maxn]; inline bool cmp(int *x,int a,int b ,int l){
return x[a]==x[b]&&x[a+l]==x[b+l];
} inline void da(int *sa,int *x,int n,int m){
int i,j,p,*y=wb;
for(i=0;i<m;i++) gs[i]=0;
for(i=0;i<n;i++) gs[x[i]]++;
for(i=1;i<m;i++) gs[i]+=gs[i-1];
for(i=n-1;~i;i--) sa[--gs[x[i]]]=i;
for(j=1,p=1;p<n;j<<=1,m=p){
for(i=n-j,p=0;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) gs[i]=0;
for(i=0;i<n;i++) gs[wv[i]]++;
for(i=1;i<m;i++) gs[i]+=gs[i-1];
for(i=n-1;~i;i--) sa[--gs[wv[i]]]=y[i];
p=1;swap(x,y);x[sa[0]]=0;
for(i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;
}
} signed main(void){
int i,j;
scanf("%s",s);n=strlen(s);len=n<<1;
for(i=0;i<n;i++) ran[i]=(int)s[i]-39;
for(i=n;i<len;i++) ran[i]=(int)s[i-n]-39,s[i]=s[i-n];
da(sa,ran,len+1,5);
for(i=0;i<n;i++) sum[i]=sum[i-1]+(s[i]=='('?1:-1);
pre[0]=sum[0];
for(i=1;i<n;i++) pre[i]=pre[i-1]>sum[i]?sum[i]:pre[i-1];
suf[n-1]=sum[n-1];
for(i=n-2;i>=0;i--) suf[i]=suf[i+1]>sum[i]?sum[i]:suf[i+1];
for(i=1;i<=len;i++)
if(sa[i]<n){
int tmp,tmp1=suf[sa[i]]-sum[sa[i]-1],tmp2=sum[n-1]-sum[sa[i]-1]+pre[sa[i]-1];
tmp=tmp1>tmp2?tmp2:tmp1;
if(sum[n-1]>=0&&tmp>=0){
for(j=0;j<n;j++) ans[j]=s[sa[i]+j];
for(j=0;j<sum[n-1];j++) ans[j+n]=')';
puts(ans);break;
}
tmp-=sum[n-1];
if(sum[n-1]<0&&tmp>=0){
tmp=-sum[n-1];
for(j=0;j<tmp;j++) ans[j]='(';
for(j=0;j<n;j++) ans[j+tmp]=s[sa[i]+j];
puts(ans);break;
}
}
return 0;
}

  


By NeighThorn

51Nod 1561 另一种括号序列的更多相关文章

  1. [ZJOI2007]捉迷藏(动态点分治/(括号序列)(线段树))

    题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条 ...

  2. 51nod 1476 括号序列的最小代价(贪心+优先队列)

    题意 我们这有一种仅由"(",")"和"?"组成的括号序列,你必须将"?"替换成括号,从而得到一个合法的括号序列. 对于 ...

  3. BZOJ4350: 括号序列再战猪猪侠

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...

  4. DP专题——括号序列

    毕竟是个渣,写完一遍之后又按LRJ的写了一遍,再写了一遍递归版,最终加上输出解部分 括号序列 定义如下规则序列(字符串): 空序列是规则序列: 如果S是规则序列,那么(S)和[S]也是规则序列: 如果 ...

  5. 51nod1476 括号序列的最小代价

    这题应该可以用费用流写吧?不过我想不出贪心来TAT.其实还是单调队列乱搞啊T_T //ÍøÉϵÄÌ°ÐÄËã·¨ºÃÉñ°¡¡£¡£¡£ÎÒÖ»»áÓÃ×îС·ÑÓÃ×î´óÁ÷ÅÜTAT #in ...

  6. uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

    #31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...

  7. CODEVS 3657 括号序列

    [问题描述] 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例 ...

  8. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  9. 数据结构(括号序列,线段树||点分治,堆):ZJOI 2007 捉迷藏

    [题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N- ...

随机推荐

  1. 【转载】最长回文字符串(manacher算法)

    原文转载自:http://blog.csdn.net/lsjseu/article/details/9990539 偶然看见了人家的博客发现这么一个问题,研究了一下午, 才发现其中的奥妙.Stupid ...

  2. 如何删除hive表格的分区

    今天的一个业务场景就是要把三年的数据从第一天不停的融合起来,每一天作为表格一个新的分区.由于空间有限,数据量很大,可能每天数据都是几十个G的大小.所以我需要做的一点就是在融合这一天之后,删除一天的分区 ...

  3. 学习python第十五天,面向对象

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集 ...

  4. 霍夫直线检测 opencv

    本次实验是检测图像中的直线,用到了HoughLines()和HoughLinesP()函数,其中HoughLinesP()称为累计概率霍夫变换,实验结果显示累计概率霍夫变换要比标准霍夫变换的效果好.具 ...

  5. Echarts 解决饼图文字过长重叠的问题

    之前在网上查找了很多关于解决饼图文字描述过长导致重叠的问题,找了很多一直没有一个合适的解决方案,最后自己只能花时间研究echarts文档,功夫不负有心人,终于解决了文字重叠展示不全等问题. 废话不多说 ...

  6. 自定义注解不能拦截controller层

    1,首先在springMVC的配置文件中,webapp/WEB-INF/servlet.xml,加上AOP的相关内容: <beans xmlns="http://www.springf ...

  7. PHP代码审计4-漏洞挖掘思路

    漏洞挖掘思路 漏洞形成的条件 1.变量可控制 2.变量可到达有利用价值的函数(危险函数) 漏洞造成的效果 漏洞的利用效果取决于最终的函数功能,变量进入什么样的函数就导致什么样的效果 危险函数 文件包含 ...

  8. 15.8,redis-cluster配置

      为什么要用redis-cluster 1.并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令假如业务需要每秒100万的命令执行呢? 2.数据量太大 一台服务器内存正常是16~ ...

  9. div+css实现双飞翼布局

    本例通过div+css实现HTML金典布局双飞翼布局,该布局结构为上中下结构,上:header头:下:footer尾:中:内容,将内容分为了三个结构,左中右 下图是效果图 我们来看下代码 <!D ...

  10. ListView.getChildCount() 详解

    ListView.getCount() 返回的所包含的item总个数 ListView.getChildCount() (ViewGroup.getChildCount()) 返回的是现实层面上所包含 ...