hihocoder-1300 展胜地的鲤鱼旗(dp)
2016-05-08 21:03
225 查看
展胜地的鲤鱼旗
时间限制:10000ms单点时限:1000ms
内存限制:256MB
描述
岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一。每年的四月中旬到五月初,这里都会举办盛大的祭奠。除了可以在盛开的樱花步道上乘坐观光马车徐行、还有横跨北上川上的鲤鱼旗,河畔还有当地特有的为祭奠祖先而编创的北上鬼剑舞。假设,我们用一个包含 '(', ')'的括号字符串来区别每面鲤鱼旗的方向。一段括号序列被称为合法的,当且仅当满足两个条件:一、对于整个序列,左括号数量等于右括号;二、对于任意前缀,左括号的数目都不小于右括号的数目。岛娘想知道,对于一串括号字符串,有多少子串是合法的,你能帮助她么。
输入
输入数据仅一行,包含一个长度为 n (1 ≤ n ≤ 106) 的括号字符串。输出
输出一行,表示合法的括号子串的数目。样例输入
(()())
样例输出
4 AC代码:
#include <bits/stdc++.h> using namespace std; #define Riep(n) for(int i=1;i<=n;i++) #define Riop(n) for(int i=0;i<n;i++) #define Rjep(n) for(int j=1;j<=n;j++) #define Rjop(n) for(int j=0;j<n;j++) #define mst(ss,b) memset(ss,b,sizeof(ss)); typedef long long LL; const LL mod=1e9+7; const double PI=acos(-1.0); const int inf=0x3f3f3f3f; const int N=2e6+5; int n,a ,dp ,sum,qu ; char str ; int main() { scanf("%s",str); int len=strlen(str); Riop(len) { if(str[i]=='(')a[i+1]=1; else a[i+1]=-1; } LL ans=0; sum=0; Riep(len) { if(a[i]>0) { sum++; qu[sum]=i; } else { if(sum>0) { dp[i]=dp[qu[sum]-1]+1; sum--; ans+=(LL)dp[i]; } } } cout<<ans<<"\n"; return 0; }
相关文章推荐
- 20145307第五次JAVA学习实验报告
- 使用More like this实现基于内容的推荐
- Javascript--JS基础语法1
- 学习练习 java20160507作业
- 清除SQL server2008 记住的用户名和密码
- c++作业:Circle
- 记事本
- 文件上传
- 设计模式之总结篇(设计模式六大原则以及设计模式三种类型)
- xml解析-pull和dom4j
- 常用bat批处理命令
- 推荐算法简单实现
- 什么是 Docker?
- c++各种分割字符串的方法
- 2602 最短路径问题
- Mark Git 初步
- DES算法C++实现
- vs2005远程工具对wince界面截图
- win32多窗口的建立
- php---print_r