博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jzoj4209 已经没有什么好害怕的了
阅读量:4557 次
发布时间:2019-06-08

本文共 1189 字,大约阅读时间需要 3 分钟。

小Y 最近开始学习算法姿势,但是因为小R 非常BB,给了她很多B6 题,所以她觉得自己已经没有什么前途了。

于是小R 给了她一些稍微简单的题,让她觉得已经没有什么好害怕的了,其中一道是这样的:

给定一个长度为n 只包含左括号和右括号的序列,现在小R 想要知道经过每一个位置的合法子串有多少个。

空串是一个合法的串,如果A 和B 都是合法的串,那么(A) 和AB 都是合法的串。 n<=1000000

又是差分的题目,非常坑

先给括号配对,让后记一对合法的括号为[l,r)

我们分别按顺序和倒序处理每对括号[l,r)

对于括号[l,r)我们先对区间[l,r)加上1,让后考虑它的影响

若l是另一对括号[l',r')的右端点(r'=l)那么显然这里的[l,r)贡献可以全部加过去

若r是另一对括号[l',r')的左端点,那么显然也可以把[l,r)的贡献全加过去

不合法的括号位置会自动抵消

#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include
#include
#include
#define N 1000010#define M 1000000007using namespace std;long long ans,f[N]; char s[N];int n,m,t,w[N],l[N],r[N],cl[N],cr[N];int _18520(){ scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;++i) if(s[i]=='(') w[++t]=i; else if(t){ r[w[t]]=i+1; l[i+1]=w[t--]; } for(int i=n+1;i;--i) cr[l[i]]+=++cr[i]; for(int i=1;i<=n;++i) cl[r[i]]+=--cl[i]; for(int i=1;i<=n;++i) f[i]=f[i-1]+cl[i]+cr[i]; for(int i=1;i<=n;++i) ans=ans+i*f[i]%M; printf("%lld\n",ans);}int main(){ int T; for(scanf("%d",&T);T--;_18520()){ memset(f,0,N<<3); memset(l,0,N<<2); memset(r,0,N<<2); memset(cl,0,N<<2); memset(cr,0,N<<2); t=ans=0; }}

转载于:https://www.cnblogs.com/Extended-Ash/p/8312578.html

你可能感兴趣的文章
2-sat 问题 【例题 Flags(2-sat+线段树优化建图)】
查看>>
ext3.2 右击动态添加node的treepanel
查看>>
Database links
查看>>
1035 插入与归并(25 分)
查看>>
STL中排序函数的用法(Qsort,Sort,Stable_sort,Partial_sort,List::sort)
查看>>
如何解决php 生成验证码图片不显示问题
查看>>
PHP,javascript实现大文件上传
查看>>
c#图像处理算法学习
查看>>
webApi之FromUri和FromBody区别
查看>>
【SoapUI】http接口测试
查看>>
各种工具网站
查看>>
数据库事务
查看>>
xe7 控件升级
查看>>
TFrame bug
查看>>
刚学习的如何才能自信的拍美美的婚纱照呢(要结婚啦)
查看>>
M51文件注释
查看>>
关于临界资源访问互斥量的死锁问题
查看>>
django-view层
查看>>
异步加载JS的方法。
查看>>
golang-gorm框架支持mysql json类型
查看>>