HDOJ 5357 Easy Sequence DP
a[i] 表示以i字符开头的合法序列有多少个
b[i] 表示以i字符结尾的合法序列有多少个
up表示上一层的'('的相应位置
mt[i] i匹配的相应位置
c[i] 包括i字符的合法序列个数 c[i]=c[up[i]]+a[i]*b[mt[i]]
括号序列不一定是合法的....
Easy Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 557 Accepted Submission(s): 165
Note:
An empty string is valid. If S is
valid, (S) is
valid. If U,V are
valid, UV is
valid.
indicating the number of test cases. For each test case:
A string s consisting
of '(' or ')' (1≤|s|≤106).
where ansi is
the number of valid substrings which contain i-th
character.
2
()()
((()))
20
42HintFor the second case, ans={1,2,3,3,2,1}, then m=1⋅1+2⋅2+3⋅3+4⋅3+5⋅2+6⋅1=42
/* ***********************************************
Author :CKboss
Created Time :2015年08月10日 星期一 14时24分51秒
File Name :HDOJ5357_2.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map> using namespace std; typedef long long int LL; const int maxn=1001000;
const LL mod=1e9+7; int n;
LL a[maxn],b[maxn],mt[maxn];
LL c[maxn];
int up[maxn];
int stk[maxn],top;
char str[maxn]; void init(int n)
{
top=0;
memset(mt,0,sizeof(mt[0])*n);
memset(a,0,sizeof(a[0])*n);
memset(b,0,sizeof(b[0])*n);
memset(c,0,sizeof(c[0])*n);
memset(up,0,sizeof(up[0])*n);
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); int T_T;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%s",str+1); n=strlen(str+1);
init(n+10); for(int i=1;i<=n;i++)
{
if(str[i]=='(')
{
up[i]=stk[top];
stk[++top]=i;
}
else if(top)
{
int u=stk[top--];
mt[u]=i; mt[i]=u;
b[i]=b[mt[i]-1]+1;
}
} while(top) mt[stk[top--]]=0; for(int i=n;i>=1;i--)
{
if(str[i]=='('&&mt[i])
{
a[i]=a[mt[i]+1]+1;
}
} LL ans=0; c[0]=0;
for(int i=1;i<=n;i++)
{
if(str[i]=='('&&mt[i])
{
c[mt[i]]=c[i]=c[up[i]]+(LL)a[i]*b[mt[i]];
}
ans+=c[i]*i%mod;
} cout<<ans<<endl;
} return 0;
}
HDOJ 5357 Easy Sequence DP的更多相关文章
- 2015 Multi-University Training Contest 6 hdu 5357 Easy Sequence
Easy Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
- HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)
HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包) 题意分析 与普通的完全背包大同小异,区别就在于多了一个个数限制,那么在普通的完全背包的基础上,增加一维,表示个数.同时for循环 ...
- HDOJ(HDU).1114 Piggy-Bank (DP 完全背包)
HDOJ(HDU).1114 Piggy-Bank (DP 完全背包) 题意分析 裸的完全背包 代码总览 #include <iostream> #include <cstdio&g ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDU 4359——Easy Tree DP?——————【dp+组合计数】
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- Rabin_Karp(hash) HDOJ 1711 Number Sequence
题目传送门 /* Rabin_Karp:虽说用KMP更好,但是RK算法好理解.简单说一下RK算法的原理:首先把模式串的哈希值算出来, 在文本串里不断更新模式串的长度的哈希值,若相等,则找到了,否则整个 ...
- HDU 4359 Easy Tree DP?
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
随机推荐
- python Web抓取(二)selenium模块的使用、对浏览器的按键操作及错误处理
建议以下帖子: 教你在Windows上搭建Python+Selenium环境:https://blog.csdn.net/huilan_same/article/details/52888262 py ...
- 从终端运行python程序
终端窗口运行.py程序 首先你要安装python,命令行输入 python 有python提示符 >>> 出现说明安装成功 程序第一行应该是 #! python3 #! python ...
- 【Henu ACM Round#15 F】Arthur and Questions
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...
- 个人学习源码的 HBase误区的总结 与 架构图
HDFS 的备份功能不是给 基于 HBase 等 基于HDFS 的项目做备份的. 如果 HBase 需要备份,那么久需要设置 备份(快照 )功能. HMaster . kafka 等无主结构并 ...
- Jsoncpp使用具体解释以及链接问题解决
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写. 同一时候也易于机器解析和生成. 它基于JavaScript Programming ...
- Android视图载入到窗体的过程分析
上一篇博客Android中Handler原理在讲到Handler的时候谈到了android的Activity启动是怎样运行到onCreate方法的,这篇主要从onCreate方法里面我们必需要写的方法 ...
- vue28-2.0-过滤器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- FTP配置说明
1.下载rpm包,如vsftpd-3.0.2-21.el7.x86_64.rpm.可在系统盘里面找到或者下载 2.参考如下步骤.或者见链接http://blog.csdn.net/uq_jin/art ...
- Gym - 100625F Count Ways 快速幂+容斥原理
题意:n*m的格子,中间有若干点不能走,问从左上角到右下角有多少种走法. 思路:CountWay(i,j) 表示从 i 点到 j 点的种数.然后用容斥原理加加减减解决 #pragma comment( ...
- MVC页面常用方法
转自:https://www.cnblogs.com/baisoft/p/5839319.html @RenderBody 在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Lay ...