当前位置:   article > 正文

上海计算机学会2022年8月月赛C++丙组T5括号计分_平衡括号(一) 内存限制: 256 mb时间限制: 1000 ms 本题已有精讲视频可供观看 点击

平衡括号(一) 内存限制: 256 mb时间限制: 1000 ms 本题已有精讲视频可供观看 点击

括号计分

内存限制: 256 Mb时间限制: 1000 ms

题目描述

括号序列是由 ( 与 ) 构成的序列。平衡的括号序列要求 ( 与 ) 出现次数一样多,而且序列的每个前缀里 ( 出现次数不低于 ) 的出现次数。

对平衡的括号序列,定义一种计分规则如下:

  • 如果只有一对括号 (),只算 1 分;
  • (A) 的分数是 A 的 2 倍;
  • AB 的分数是 A 与 B 的和,其中 A 与 B 必须是平衡的括号序列。

给定一个平衡的括号序列,请计算它的分数,由于数字可能很大,输出答案模 1,000,000,007 的余数。

输入格式

单个字符串:表示输入的序列。

输出格式

单个整数:表示括号序列的分数模 1,000,000,007 的余数。

数据范围

设 n 表示输入字符串的长度,

  • 对于 50% 的数据,1≤n≤200;
  • 对于 100% 的数据,1≤n≤200,000。
样例数据

 输入:
()()()
输出:
3


输入:
((()))
输出:
4

解析:

因为数值跟深度有关,我们可以遇到左括号就增加深度,遇到右括号就计算数值。

根据深度和括号里的数值来求。

详见代码: 

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. string a;
  4. long long b[1000005];
  5. int main() {
  6. int len;
  7. int lever = 0;//括号级别
  8. cin >> a;
  9. len = a.length();
  10. for (int i = 0; i < len; i++) {
  11. if (a[i] == '(') {//左括号
  12. lever++;//级别加1
  13. } else {//右括号
  14. if (b[lever] == 0) {//分数为0(里边没有括号)
  15. b[lever]++;//加一
  16. } else {//不为0(里边有括号)
  17. b[lever] *= 2;//分数乘2
  18. }
  19. b[lever-1] += b[lever];//分数累加到上一个级别
  20. b[lever] = 0;//当前级别分数归零
  21. lever--;//级别减一
  22. b[lever] %= 1000000007;//分数求模
  23. }
  24. }
  25. cout << b[0] << endl;
  26. }

 上海市西南模范中学 房和田老师的递归算法

计算分数是一个递归的过程
从第一个开始循环,如果当前是 "(" ,那就 dfs 找到和它配对的 ")" 顺便算一下这里面的分数再乘2就可以
然后我们发现输入的括号序列会有很多个 "()",(这里指的是在外层的)
把他们的分数都用 dfs 算出来然后加在一起就可以了,在 "()" 里面的多个并列的 "()" 也是这样,都算出来,再加到一起就可以了
代码非常的简单:

  1. #include <cstring>
  2. #include <iostream>
  3. using namespace std;
  4. const int mod = 1000000007;
  5. int len,ans;
  6. int loc,idx = 0;
  7. string c;
  8. int dfs(int idx) {
  9. int score = 0,cnt = 0;
  10. for(int i = idx; i < len; i ++) {
  11. if(c[i] == '(') {
  12. if(i != idx && c[i - 1] == ')')
  13. {
  14. score = (score + dfs(i)) % mod;
  15. i = loc;
  16. }
  17. else cnt ++;
  18. } else {
  19. cnt --;
  20. if(i != 0 && c[i - 1] == ')') score = score * 2 % mod;
  21. else score = 1;
  22. }
  23. if(cnt == 0) {
  24. loc = i;
  25. return score % mod;
  26. }
  27. }
  28. }
  29. int main() {
  30. cin >> c;
  31. len = c.size();
  32. while(idx != len) {
  33. ans = (ans + dfs(idx)) % mod;
  34. idx = loc + 1;
  35. }
  36. cout << ans << endl;
  37. return 0;
  38. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/439959
推荐阅读
相关标签
  

闽ICP备14008679号