CF653F Paper task
题目描述
Alex 在编程的时候,他的女儿 Valentina(一个小孩)来到身边,不停地问代码中的圆括号(即小括号)的问题。他耐心地给她解释了一些,在她理解后,Alex 给了她一个任务,这样他才能有时间完成自己的代码。
在本题中,我们只关注由左括号 '(' 和右括号 ')' 组成的字符串。
如果一个括号序列满足以下条件之一,则称其为“合法括号序列”:
1. 该序列为空;
2. 该序列是一个被一对括号包裹起来的合法括号序列;
3. 该序列是两个合法括号序列的连接。
例如,序列 "()()" 和 "((()))(())" 是合法的,而 ")(()"、"(((((" 和 "())" 都不是。
Alex 在一张纸上写下了一个只包含括号的字符串 $s$,让 Valentina 统计 $s$ 的所有不同的非空子串中,属于合法括号序列的个数。换句话说,她的任务是统计在字符串 $s$ 中作为子串出现的所有不同的非空合法括号序列的数量(注意是子串,不要与子序列混淆)。
当 Valentina 完成任务后,Alex 发现自己其实并不知道答案。请你帮助 Alex,不要在女儿面前出丑,求出答案。
输入格式
输入的第一行包含一个整数 $n$($1 \leq n \leq 500000$),表示字符串 $s$ 的长度。
输入的第二行是一个长度为 $n$ 的字符串 $s$,只包含字符 '(' 和 ')'。
输出格式
输出一个整数,表示 $s$ 中作为子串出现的所有不同的非空合法括号序列的数量。
说明/提示
在第一个样例中,需要统计的不同子串有 $5$ 个,分别是:"()"、"()()"、"()()()"、"()()()()" 和 "()()()()()"。
在第二个样例中,需要统计的不同子串有 $3$ 个,分别是:"()"、"(())" 和 "(())()"。
由 ChatGPT 5 翻译