HDU - 5357
2015-08-10 11:56
246 查看
本题目的方法,
(()()()) 要处理的大概如图所示,对于任意一个‘(’或者‘)’可以找到其第一个与之匹配的括号,那么记ai为以i为起始位置的所有情况,bi以i为结尾的所有情况,up[I]
为第一个包含(Si->Smatchi)子串的第一个‘(’
那么解为ans[i] = ans[up[i]] +a[i]*a[match[i]];
(()()()) 要处理的大概如图所示,对于任意一个‘(’或者‘)’可以找到其第一个与之匹配的括号,那么记ai为以i为起始位置的所有情况,bi以i为结尾的所有情况,up[I]
为第一个包含(Si->Smatchi)子串的第一个‘(’
那么解为ans[i] = ans[up[i]] +a[i]*a[match[i]];
#include <bits/stdc++.h> using namespace std; typedef long long LL; #define rep1(i,x,y) for(int i=x;i<=y;i++) #define rep(i,n) for(int i=0;i<(int)n;i++) const int N= 2000000 + 1000, mod = 1e9 + 7; int mt ,up ,stk ,n; LL a ,b ,d ; char s ; int main() { int T; scanf("%d",&T); while(T--){ scanf("%s",s+1); n=strlen(s+1); memset(mt,0,sizeof(mt[0])*(n+10)); memset(up,0,sizeof(up[0])*(n+10)); memset(a,0,sizeof(a[0])*(n+10)); memset(b,0,sizeof(a[0])*(n+10)); memset(d,0,sizeof(d[0])*(n+10)); int top = 0; rep1(i,1,n){ if(s[i]=='('){ up[i] = stk[top]; stk[++top]=i; } else if(top){ mt[mt[i]=stk[top--]]=i; b[i]=b[mt[i]-1]+1; } } while(top>0) {up[stk[top--]]=0; } for(int j=n;j;j--){ if(s[j]=='(' && mt[j]){ a[j]=a[mt[j]+1]+1; } } LL ans = 0; for(int i=1;i<=n;i++){ if(s[i] =='(' && mt[i]){ d[i] = d[mt[i]] = (up[i] ? d[up[i]]:0)+a[i]*b[mt[i]]; } ans+=d[i]*i%mod; } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- 【OSS】Bucket读写权限
- 创建IPC端口失败:拒绝访问
- 隐藏状态栏
- Making your FIFA 16 final Team with the Legends
- leetCode #242 Valid Anagram
- CocoaPods 安装ru
- Trapping Rain Water
- linux下安装google protobuf(详细)
- java多线程实现
- 腾讯实习生笔试题
- 【SICP感应】1 工艺和替代模式
- javascript密码强度校验代码(两种方法)
- Hadoop2.x eclipse下编程环境配置
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
- 网络流24题 01 飞行员配对方案问题 (多源多汇点+最大流)
- ScrollView嵌套Listview导致Listview显示不全解决方案
- [前端] canvas绘制圆、渐变、字体和图片及其他
- 黑马程序员——类加载器
- ssh免密码登陆远程服务器
- 如何在WPF中嵌入Winform控件