洛谷P3719 [AHOI2017初中组]rexp

洛谷P3719 [AHOI2017初中组]rexp

题目背景

以下为不影响题意的简化版题目。

题目描述

给出一个由(,),|,a组成的序列,求化简后有多少个a。

化简规则:

1、形如aa...a|aa...a|aa...a的,化简结果为“|”两边a的个数最多的一项,例如a|aa|aaa=aaa 3、先算带括号的序列,例如(a|a)|aaa=aaa

输入格式

一行一个序列

输出格式

化简后a的个数

输入输出样例

输入 #1
aa(aa)|(aa|(a|aa))aa
输出 #1
4

说明/提示

原题的样例记不得了,只能随便写个代替了。。。

序列长度不超过100000

保证序列合法且括号内和“|”左右均非空

Solution

貌似写过这种题,类似于P1022 计算器的改良

但是我怎么感觉这比计算器要简单很多呢?

还是说我把P1022想的太复杂了?

Algorithm

在P1022中,我们可以用到分类讨论+分治的思想,但是在那道题中不是很明显吧

这道题用分治就非常好做了:

  1. 不需要先读入字符串
  2. 不需要想P1022那样存储数字
  3. 不需要判断那么多字符,例如=,+,-,以及隐藏的*

那么用分治的话该怎么做呢?

 

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int rec()
 5 {
 6     int a=0;
 7     char t;
 8     while(scanf("%c",&t)!=EOF)
 9     {
10         if(t=='a') a++;
11         if(t=='|') return max(a,rec());
12         if(t=='(') a+=rec();//不能写成 return a+rec() !
13         if(t==')') return a;
14     }
15     return a;
16 }
17 int main()
18 {
19     cout<<rec();
20     return 0;
21 }

 

posted @ 2019-11-05 23:50  Vanilla_chan  阅读(340)  评论(0编辑  收藏  举报