CF653F. Paper task

CF653F. Paper task

简要题面

给定括号序列SSS,求其中本质不同合法括号序列个数。(∣S∣≤5∗105|S|\leq 5*10^5S5105)

Solution

感觉用了一个很麻烦的方法。
我们可以考虑枚举本质不同串的右端点,每次动态地在SAMSAMSAM里面加入末尾元素,新增的本质不同后缀个数rrr即为lenlst−lenfa[lst]len_{lst}-len_{fa[lst]}lenlstlenfa[lst],显然新增的本质不同串的起点是[1,r][1,r][1,r],终点是iii

现在我们考虑有多少起点在[1,r][1,r][1,r]中的序列合法,我们对于1..i1..i1..i做一个括号匹配,倘若有左括号没被消掉,则起点只可能在没消掉的左括号右边,令l=max(stk[i])l=max(stk[i])l=max(stk[i]),表示最右边的未消掉的左括号。

此时起点在[l+1,r][l+1,r][l+1,r]的串显然只需要满足一个条件——左右括号个数相等即可(因为此时左括号个数不可能多于右括号),因此建一个线段树维护区间内左右括号个数差即可。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-15;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const int MAXN=500005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
char st[MAXN];
int n,s[MAXN],stk[MAXN],top=0;
PR S[MAXN<<2];
void build(int x,int l,int r)
{if (l==r) { S[x]=MP(s[l],1); return; }int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);S[x].fi=min(S[x<<1].fi,S[x<<1|1].fi),S[x].se=0;if (S[x].fi==S[x<<1].fi) S[x].se+=S[x<<1].se;if (S[x].fi==S[x<<1|1].fi) S[x].se+=S[x<<1|1].se;
}
PR query(int x,int l,int r,int L,int R)
{if (l>=L&&r<=R) return S[x];int mid=(l+r)>>1;if (R<=mid) return query(x<<1,l,mid,L,R);else if (L>mid) return query(x<<1|1,mid+1,r,L,R);else{PR X=query(x<<1,l,mid,L,mid),Y=query(x<<1|1,mid+1,r,mid+1,R);if (X.fi==Y.fi) return MP(X.fi,X.se+Y.se);return (X.fi<Y.fi)?X:Y;}
}
int len[MAXN<<1],t[MAXN<<1][2],fa[MAXN<<1],sz=2,lst=1;
void insert(int c)
{int p=lst,np=lst=sz++;len[np]=len[p]+1;for (;p&&!t[p][c];p=fa[p]) t[p][c]=np;if (!p) { fa[np]=1; return; }int q=t[p][c];if (len[q]==len[p]+1) fa[np]=q;else{int nq=sz++;len[nq]=len[p]+1;fa[nq]=fa[q];fa[np]=fa[q]=nq;memcpy(t[nq],t[q],sizeof t[0]);for (;t[p][c]==q;p=fa[p]) t[p][c]=nq;}
}
signed main()
{n=read();scanf("%s",st+1);for (int i=1;i<=n;i++) s[i]=s[i-1]+(st[i]=='('?1:-1);build(1,0,n-1);ll ans=0;for (int i=1;i<=n;i++){if (st[i]=='(') stk[++top]=i;else if (top) stk[top--]=0;int l=stk[top]+1;insert(st[i]==')');int r=len[lst]-len[fa[lst]];if (l<=r){PR t=query(1,0,n-1,l-1,r-1);if (t.fi==s[i]) ans+=t.se;}}printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

52ABP和ABP的关系

52ABP和ABP的关系本文作者&#xff1a;52ABP开发团队 文章会随着版本进行更新&#xff0c;关注我们获取最新版本 本文出处&#xff1a;https://www.52abp.com/wiki/common/latest 源代码&#xff1a; https://www.github.com/52abp 52ABP和ABP的关系ASP.NET Boilerplate是一个开…

CF1167F. Scalar Queries

CF1167F. Scalar Queries Solution 拆贡献&#xff0c;自身的贡献为bi∗(i−1)∗(n−i)b_i*(i-1)*(n-i)bi​∗(i−1)∗(n−i)&#xff0c;每一个左边比他小的数bjb_jbj​会产生bi∗j∗(n−i)b_i*j*(n-i)bi​∗j∗(n−i)的贡献&#xff0c;需要维护∑j\sum_{j}∑j​&#xff0…

【译】C#9的候选功能

通往C# 9 的漫长道路已经开始了&#xff0c;这是世界上第一篇关于C# 9候选功能的文章。阅读完本文后&#xff0c;你将希望为将来遇到新的C#挑战做好充分准备。 这篇文章基于&#xff1a;C#语言版本计划 9.0 候选功能基于记录和模式匹配的表达式我一直在长时间等待这个功能。记录…

CF641D. Little Artem and Random Variable

CF641D. Little Artem and Random Variable Solution 设给定的两个序列为mx1..n,mn1..nmx_{1..n},mn_{1..n}mx1..n​,mn1..n​。 令第一个骰子投到1..n1..n1..n的概率为p1..np_{1..n}p1..n​ 令第二个骰子投到1..n1..n1..n的概率为q1..nq_{1..n}q1..n​ 显然有 mxi(∑j≤ipj)…

AKS开讲啦! | DevOps with AKS

上周小Phippy搬到了Kube船长船上的Pods里&#xff0c;感觉好极了&#xff0c;那今天我们继续看看Phippy的兴趣爱好哦。探索Kube船上的世界上篇&#xff08;点击回顾&#xff09;小Phippy 搬到了船上的Pods里&#xff0c;感受到了回家般的舒适感&#xff0c;小Phippy希望能发挥一…

CF1157G. Inverse of Rows and Columns

CF1157G. Inverse of Rows and Columns Solution 首先枚举第一行是否变换&#xff0c;再枚举第一行的010101状态&#xff0c;即可确定列变换。 然后对于之后的行变换&#xff0c;从前往后贪心地让111出现得尽可能晚即可。 Code #include <vector> #include <list&…

把文件隐藏在图片中

一、前言有的时候我们需要把文件给隐藏起来&#xff0c;但是Windows自带的隐藏方式还是很容易被发现的。这时候我们可以选择把文件放在网盘&#xff0c;但这毕竟需要网络。不过&#xff0c;我们可以通过Windows自带的功能&#xff0c;把文件隐藏在图片中。是不是有一种大隐隐于…

CF1156F. Card Bag

CF1156F. Card Bag Solution 概率DPDPDP。 记cnticnt_icnti​表示有多少个ajia_jiaj​i&#xff0c;再把aia_iai​离散化。 令fi,jf_{i,j}fi,j​表示当前取过iii个数&#xff0c;当前取到了aja_jaj​的概率。 fi,jfi−1,k∗cntain−i1f_{i,j}f_{i-1,k}*\frac{cnt_{a_i}}{n-i1…

.NetCore下使用Polly结合IHttpClientFactory实现聚合服务

在使用微服务的过程中经常会遇到这样的情况&#xff0c;就目前我遇到的问题做下分析情况一&#xff1a;这里服务对于前后端分离情况来说&#xff0c;多使用查询服务&#xff0c;前端直接获取不同服务的数据展示&#xff0c;如果出现其中的服务失败&#xff0c;对业务数据无影响…

CF1342E. Placing Rooks

CF1342E. Placing Rooks Solution 有一个显然的性质&#xff1a; 要么每行都有至少一个&#xff0c;要么每列至少有一个。 只看每行有至少一个的情况&#xff1a; 显然必有n−kn-kn−k列有棋子。 考虑容斥&#xff0c;枚举空列的数量iii。 Ans∑(−1)i∗(n−ki)∗(n−k−i)n…

你需要了解的有关.NET日期时间的必要信息

引言DateTime数据类型是一个复杂的问题&#xff0c;复杂到足以让你在编写【将日期从Web服务器返回到浏览器】简单代码时感到困惑。ASP.NET MVC 5和 Web API 2/ASP.NETCore 以不同方式序列化日期&#xff0c;这可能会给在一个Web应用程序中同时使用这两个序列化的开发人员带来更…

CF750F. New Year and Finding Roots

CF750F. New Year and Finding Roots Solution 设当前节点为xxx&#xff0c; 若当前节点为叶子节点&#xff0c;则向它的邻居跑。 若当前节点为根&#xff0c;则找到答案。 否则&#xff0c;每次从xxx向两个方向找&#xff0c;每次只走一个没有走过的邻居&#xff0c;显然可以…

只需3步,即可将你的Chromium Edge 浏览器设置成中文

最近&#xff0c;Chromium Edge 浏览器推出了添加语言包的功能&#xff0c;于是我们可以轻松将其界面设置成中文的。第1步: 升级浏览器到最新版在Chromium Edge 浏览器的地址栏中输入:edge://settings/help稍等片刻&#xff0c;浏览器会自行升级到最新版。第2步: 将Language se…

CF730F. Ber Patio

CF730F. Ber Patio Solution 由于∑ai\sum{a_i}∑ai​只有10510^5105&#xff0c;即除掉原有的bbb&#xff0c;代金券最多为10410^4104&#xff0c;因此我们令f[i][j]f[i][j]f[i][j]表示到了第iii天&#xff0c;靠现金获得的代金券共为jjj的最小现金和。 转移时枚举第i1i1i1…

【北京】线下活动 | Azure SQL Database Managed Instance发布会

6/12/2019 | 8.30 AM - 1.30 PM微软大厦一号楼一层故宫会议室N丹棱街5号 海淀区 北京市S尊敬的客户感谢您一直以来对微软的支持&#xff01;诚挚地邀请您参加微软Azure SQL Database Managed Instance &#xff08;SQL Database托管实例&#xff09;在中国北京的发布会。SQL Da…

CF768F. Barrels and boxes

CF768F. Barrels and boxes Solution 又一道据说是套路题。 核心在于枚举WWW的连续段个数为xxx。 然后就能知道FFF的连续段个数为x−1,x,x1x-1,x,x1x−1,x,x1&#xff0c;可以用插板法求出任意把WWW分xxx段的方案数&#xff0c;分xxx段每段WWW至少HHH个的方案数&#xff0c;…

ASP.Net Core MVC 发生二次请求

Bug回忆录昨天搭建新框架的时候&#xff0c;遇到一个很奇怪的“Bug”&#xff0c;每次请求都会触发两次Aciton&#xff0c;举例子吧&#xff0c;Demo&#xff1a;_Layout.cshtmlHomeControllerIndex.cshtml<h1>Hi, Im index page.</h1>最简单不过的代码&#xff0c…

CF1354F. Summoning Minions

CF1354F. Summoning Minions Solution VPVPVP结束十分钟后AC,qwqAC,qwqAC,qwq。 首先因为ai,bi≥0a_i,b_i \geq 0ai​,bi​≥0&#xff0c;所以所有东西全用一次答案不会变劣&#xff0c;留到最后的集合大小一定为kkk。 如果我们知道留到最后的集合Sx1,x2...xkS{x_1,x_2...x…

DDD战略设计相关核心概念的理解

前言本文想再讨论一下关于领域、业务、业务模型、解决方案、BC、领域模型、微服务这些概念的含义和关系。初衷是我发现现在DDD领域建模以及解决方案落地过程中&#xff0c;常常对这些概念理解不清楚或者有歧义&#xff0c;导致我们不知道如何运用这些概念来落地我们的软件。领域…

CF1037H. Security

CF1037H. Security Solution 1 设原串为ststst。 对于单个询问&#xff0c;答案必然是询问串sss的一个前缀s[1..i]s[1..i]s[1..i]加上一个大于s[i1]s[i1]s[i1]的字符ccc构成。 因此我们只需要枚举前缀s[1..i]s[1..i]s[1..i]&#xff0c;枚举字符ccc&#xff0c;快速询问s[1…