首页 > 其他分享 >已经没有什么好害怕的了

已经没有什么好害怕的了

时间:2022-10-03 13:55:05浏览次数:36  
标签:匹配 int 什么 分治 害怕 括号 lst 一个 已经

image

先观察一下性质,会发现如果一个右括号在原序列中匹配到的是某一个左括号,那么他怎么匹配都是那个左括号。如果原序列中他匹配不到,那在所有子串中他都匹配不到。

还有一个难发现的。我们通过括号的嵌套情况分层,那么在所有子串中,嵌套情况不会变。

我们不妨分治地做。首先用一个栈求出一个右括号所匹配的左括号,一个左括号所匹配的右括号。然后分治每一个区间 \([l,r]\),每次把区间 \([l,r]\) 最外层的那一些括号进行处理后,再进入到下一层处理。

具体而言,我们统计答案是肯定要用差分的。对于一个左括号,我们需要知道有多少个括号序列从这里开始。那么在分治的某一层中,也就是问在这个左括号的后面,下一个不合法括号的前面,有多少个同一层合法的右括号。我们可以通过不停地跳括号的方式来实现。右括号同理。

那么最后求差分数组前缀和就行了。

#include<bits/stdc++.h>
const int N=1e6+5,P=1e9+7;
int t,n,st[N],tp,lst[N],nxt[N];
long long ans,f[N];
char s[N];
void solve(int l,int r)
{
	if(l>=r)
		return;
	int k(0);
	for(int i=r;i>=l;i--)
	{
		if(lst[i])
		{
			solve(lst[i]+1,i-1);
			++k;
			f[lst[i]]+=k;
			i=lst[i];
		}
		else
			k=0;
	 } 
}
void calc(int l,int r)
{
	if(l>r)
		return;
	int k(0);
	for(int i=l;i<=r;i++)
	{
		if(nxt[i])
		{
			calc(i+1,nxt[i]-1);
			++k;
			f[nxt[i]+1]-=k;
			i=nxt[i];
		}
		else
			k=0;
	}
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",s+1),tp=ans=0;
		n=strlen(s+1);
		memset(f,0,sizeof(f));
		memset(lst,0,sizeof(lst));
		memset(nxt,0,sizeof(nxt));
		for(int i=1;i<=n;i++)
		{
			if(s[i]=='(')
				st[++tp]=i;
			else if(tp)
				lst[i]=st[tp],nxt[st[tp]]=i,--tp;
		}
		solve(1,n);
		calc(1,n);
		for(int i=1;i<=n;i++)
		{
			f[i]+=f[i-1];
			ans+=(1LL*f[i]%P*i)%P;
		}
		printf("%lld\n",ans);
	}
}

标签:匹配,int,什么,分治,害怕,括号,lst,一个,已经
From: https://www.cnblogs.com/mekoszc/p/16750436.html

相关文章

  • 线段树什么的最讨厌了
    发现如果正着从一颗线段树搜到这一个区间,很难搜。所以考虑从一个区间搜出一颗线段树。对于一个区间\([l,r]\),他的父亲区间只可能是\([2*l-r-2,r],[2*l-r-1,r],[l,2*r-l......
  • 写代码为了什么?
    写代码讲真的没啥意思,坚持学习和写代码只是因为写代码能给我带来三两碎银,这三两碎银能解决我生活中99%的烦恼。就是这么简单而已。你以为我不想去看阿拉斯加的鲤鱼跃出水......
  • 序号大小级别是什么
    第一层为汉字数字加顿号,例如:“一、”“二、”“三、”; 第二层为括号中包含汉字数字,例如:“(一)”“(二)”“(三)”; 第三层为阿拉伯数字加下脚点,例如:“1.”“2.”“3.”; 第四......
  • C# 内存泄漏之 Internal 关键词代表什么?
    一:背景1.背景前段时间有位朋友咨询说他的程序出现了非托管内存泄漏,说里面有很多的HEAP_BLOCK都被标记成了Internal状态,而且size都很大,让我帮忙看下怎么回事?比如......
  • 写过自定义指令吗,原理是什么?
    背景看了一些自定义指令的文章,但是探究其原理的文章却不多见,所以我决定水一篇。如何自定义指令?其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。除......
  • react的jsx和React.createElement是什么关系?面试常问
    1、JSX在React17之前,我们写React代码的时候都会去引入React,并且自己的代码中没有用到,这是为什么呢?这是因为我们的JSX代码会被Babel编译为React.createElement,我们来......
  • 02-分布式会话[为什么使用无状态会话, 单Tomcat会话...]
    为何使用无状态会话有状态会话都是放在服务器,一旦用户会话多,那么内存就会出现瓶颈,而无状态会话可以采用介质,前端可以使用Cookie(app可以使用缓存)保存用户ID或者......
  • 什么是补码
    什么是补码众所周知,符号位不变,负数原码数值取反后\(+1\)即可得到补码,补码可以用加法来代替减法,刚学的小朋友可能完全不知所然,补码是个完全模糊的概念。我们先用十进制来......
  • java中参数里面三个点代表什么呢?
    转自:​​http://www.java265.com/JavaCourse/202203/2426.html​​可变参数:   在计算机程序设计,一个可变参数函数是指一个函数拥有不定引数,即是它接受一个可变数目的......
  • 企业数据填报系统能解决什么样的问题?_光点科技
    你是否遇到过以下问题:企业数据填报量大,重复性工作多?公司部门数据分散、残缺不全,没有数据聚合应用?数据核验工具缺失,人工校验投入大?当你每年填写大批的报表时,你是否在想,系统明......