首页 > 其他分享 >括号匹配(二位数点)

括号匹配(二位数点)

时间:2023-08-26 16:24:36浏览次数:22  
标签:pre 匹配 二位数 sum ne tot 括号 int maxn

串\(S\)有左右括号和通配符\(?\),问\(S\)有多少子串可以成为合法括号串。

其中,\(|S|\le10^6\)

思考:一个区间如何合法?

1,该区间长度为偶数

2,令 \((\) 和 \(?\) 为 \(1\) , \()\) 为 \(-1\) , 该区间的前缀和里没有负数

3,令 \()\) 和 \(?\) 为 \(1\) , \((\) 为 \(-1\) , 该区间的后缀和里没有负数

考虑记下面两个数组:

记\(ne_i\)表示:令 \((\) 和 \(?\) 为 \(1\) , \()\) 为 \(-1\) , \([i,ne_i]\)的前缀和里没有负数,若\(ne_i\)有多种可能性,则\(ne_i\)为最大的那个数

记\(pre_i\)表示:令 \()\) 和 \(?\) 为 \(1\) , \((\) 为 \(-1\) , \([pre_i,i]\)的后缀和里没有负数,若\(pre_i\)有多种可能性,则\(pre_i\)为最小的那个数

这两个可以使用单调栈处理。

那我们可以将问题转换成:

枚举每个\(i\in [1,|S|]\),求有多少个\(j\)满足\(j\in [i,ne_i],pre_j\le i\)

把它转换成二位数点:

考虑对于每个构建直角坐标系,在坐标系中加入点\((l,ne_l),(l,l-1)\),并且对于每个点考虑有多少个\((pre_r,r)\)在它的左下角。答案记作\(ans_{(l,ne_l)}\),则对于每个\(i\),它的贡献为\(ans_{(l,ne_l)}-ans_{(l,l-1)}\)

注意,要开奇偶两个数组,因为\(2|(r-l+1)\)

考虑树状数组优化,时间复杂度\(O(|S| \log |S|)\)

#include<bits/stdc++.h>
#define lowbit(pos) pos&(-pos)
using namespace std;

const int maxn=1e6+5;

int n,p[maxn],q[maxn],sum[maxn],st[maxn],tot=0,cnt=0;
char s[maxn];
long long ans=0;
struct node {
	int r,p,k,op;
}t[maxn<<1];
bool cmp(node a,node b) {
	return a.p<b.p;
}
int tr[2][maxn];
void add(int pos,int k,int op) {
	for(;pos<=n;pos+=lowbit(pos))
		tr[op][pos]+=k;
}
int query(int pos,int op) {
	int ret=0;
	for(;pos;pos-=lowbit(pos))
		ret+=tr[op][pos];
	return ret;
}

int main() {
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int i=1;i<=n;i++) {
		sum[i]=sum[i-1];
		if(s[i]!=')') sum[i]++;
		else sum[i]--;
	}
	for(int i=n;i>=1;i--) {
		st[++tot]=i;
		while(tot&&sum[st[tot]]>=sum[i-1]) tot--;
		if(tot) p[i]=st[tot]-1;
		else p[i]=n;
	}
	tot=0;
	for(int i=n;i>=1;i--) {
		sum[i]=sum[i+1];
		if(s[i]!='(') sum[i]++;
		else sum[i]--;
	}
	for(int i=1;i<=n;i++) {
		st[++tot]=i;
		while(tot&&sum[st[tot]]>=sum[i+1]) tot--;
		if(tot) q[i]=st[tot]+1;
		else q[i]=1;
	}
	for(int i=1;i<=n;i++)
		if(i<=p[i]) {
			t[++cnt]={i,p[i],1,i&1};
			if(i>1) t[++cnt]={i,i-1,-1,i&1};
		}
	sort(t+1,t+1+cnt,cmp);
	for(int i=1,j=1;i<=n&&j<=cnt;i++) {
		if(q[i]<=i) add(q[i],1,i&1);
		while(j<=cnt&&t[j].p==i) {
			ans+=t[j].k*query(t[j].r,1-t[j].op);
			j++;
		}
	}
	printf("%lld",ans);
	return 0;
}

标签:pre,匹配,二位数,sum,ne,tot,括号,int,maxn
From: https://www.cnblogs.com/pengchujie/p/17658958.html

相关文章

  • Python中小括号( )、中括号[ ]和大括号{}分别代表什么?
     Python中,小括号 () 代表元组数据类型,中括号 [] 代表列表数据类型,大括号 {} 代表字典数据类型。 元组是一种不可变序列,创建方法很简单,大多时候都是用小括号括起来的。例如:tup=(1,2,3)列表是一种可变序列,其创建方法即简单又特别。例如:list=['a','b',......
  • 串的匹配算法:Brute-Force 与 KMP
    目录串的匹配算法:Brute-Force与KMPBrute-Force(布鲁特-福斯)算法KMP算法参考文献串的匹配算法:Brute-Force与KMP串的匹配算法是求子串在主串位置的算法。本次介绍的算法是在指定了从主串特定位置后寻找第一个匹配字串的位置。在介绍算法前,先定义几个变量:主串S、字串T、要求......
  • VisionPro CogPMAlignTool图像匹配工具的使用详解
    PMAlign工具:此工具可用于训练模板,然后使用在连续的输入图像中搜索模板。可指定执行模板训练或模板搜索时要使用的算法类型,并可选择利用图像还是利用形状模型集合创建已训练模板。输入图像内的可选搜索区域可限制模板搜索的范围。目的:这里主要分享一下,如何在一个ToolBlock中使......
  • 超越界限:大模型应用领域扩展,探索文本分类、文本匹配、信息抽取和性格测试等多领域应用
    超越界限:大模型应用领域扩展,探索文本分类、文本匹配、信息抽取和性格测试等多领域应用随着ChatGPT和GPT-4等强大生成模型出现,自然语言处理任务方式正在逐步发生改变。鉴于大模型强大的任务处理能力,未来我们或将不再为每一个具体任务去finetune一个模型,而是使用同一个大模型......
  • 由P7914括号序列(A题)引发的关于区间DP的思考
    和CF149DColoringBrackets(B题)一样,都是关于括号的区间DP。在B题中,有一个细节,就是在枚举断点时枚举到第一个就要break,这是为了使每种方案只贡献一次,防止一种方案中有多个符合条件的断点。此题中,因为序列的字符是不变的,所以直接break就行了。但是在A题中,情况变得比较复杂,比如一......
  • Python结合文件名将文件复制到匹配的多个文件夹内
       本文介绍基于Python语言,针对一个文件夹下的大量栅格遥感影像文件,基于其各自的文件名,分别创建指定名称的新文件夹,并将对应的栅格遥感影像文件复制到不同的新文件夹下的方法。  首先,我们来看一下本文需要实现的需求。现有一个文件夹,其中有大量.tif格式的栅格遥感影像文件,以......
  • 使用.NET Jieba.NET 的 PosSegmenter 实现中文分词匹配
    ​目录引言1.什么是中文分词2.Jieba.NET简介3.PosSegmenter介绍4.实现中文分词匹配4.1安装Jieba.NET库4.2创建PosSegmenter实例4.3分词和词性标注4.4中文分词匹配5.总结 引言        在自然语言处理领域,中文分词是一个重要且基础的任务。中文文......
  • Chrome116驱动下载路径 解决版本不匹配问题
    更新于2023-08-23后续可能会有同步,就不会引发该问题要看解决可以直接看最后的总结背景执行selenium代码报错fromseleniumimportwebdriverdriver=webdriver.Chrome()原因selenium.common.exceptions.SessionNotCreatedException:Message:sessionnotcreated:......
  • 社区交友源码支持聊天私聊/礼物系统/直播系统/缘分匹配+搭建教程
    功能:社区动态,即时聊天,私聊,好友系统,礼物系统,直播系统,缘分匹配,金币系统  免费下载链接:提取码:lsp6后端安装说明:环境nginx,php7.3,MySQL5.6一、后端安装说明:1.删除config/install.lock输入程序所在网址即可自动安装2.php需要开启https支持3.安装完成删除install.lock二、前端安装编......
  • 国际多语言出海商城源码/返佣产品自动匹配拼单商城源码
    源码介绍:国际多语言出海商城返佣产品自动匹配订单拼单商城源码,8国多语言出海拼单商城。此网站是很多巴西客户定制的原型,已投放运营符合当地本地化。多语言商城返利返佣投资理财派单自带余额宝,采取全新支付端口,后台语音提醒,客服中心改造豪华页面,赠送客服系统。后台釆取全新框架,余额......