Time Limit: 1000 ms Memory Limit: 128 MB
Total Submission: 82 Submission Accepted: 16
Judge By Case
Description
给出一个由(,),|,a组成的序列,求化简后有多少个a。
化简规则:
1、形如aa...a|aa...a|aa...a的,化简结果为“|”两边a的个数最多的一项,例如a|aa|aaa=aaa 3、先算带括号的序列,例如(a|a)|aaa=aaa
化简规则:
1、形如aa...a|aa...a|aa...a的,化简结果为“|”两边a的个数最多的一项,例如a|aa|aaa=aaa 3、先算带括号的序列,例如(a|a)|aaa=aaa
Input
一行一个序列
Output
化简后a的个数
Sample Input
Original | Transformed |
aa(aa)|(aa|(a|aa))aa
aa(aa)|(aa|(a|aa))aa[EOF]
Sample Output
Original | Transformed |
4
4[EOF]
Hint
序列长度不超过100000
保证序列合法且括号内和“|”左右均非空
保证序列合法且括号内和“|”左右均非空
思路是每个符号定义一个函数,遇到那个符号就调用那个函数继续计算
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
//#define DEBUG
using namespace std;
int operator2(int num1);
int operator1();
deque<char>d;
int main() {
#ifdef DEBUG
freopen("Text.txt", "r", stdin);
#endif // DEBUG
char c;
string s;
while (cin >> s) {
int num = 0;
for (int i = 0; i<s.size(); i++)
d.push_back(s[i]);
while (!d.empty()) {
c = d.front();
if (!d.empty())
d.pop_front();
if (c == '(')
num += operator1();
else if (c == '|')
num = operator2(num);
else if (c == 'a')
num++;
}
s.clear();
printf("%d\n", num);
}
return 0;
}
int operator1() {
char c;
int num = 0;
while (c = d.front()) {
d.pop_front();
if (c == ')') {
return num;
}
else if (c == 'a')
num++;
else if (c == '|') {
num = operator2(num);
}
else if (c == '(')
num += operator1();
}
}
int operator2(int num1) {
int num2 = 0;
char c;
while (!d.empty()) {
c = d.front();
if (c == '(') {
if (!d.empty())
d.pop_front();
num2 += operator1();
}
else if (c == 'a') {
if (!d.empty())
d.pop_front();
num2++;
}
else {
return max(num1, num2);
}
}
return max(num1, num2);
}
比赛的时候写少两行代码一直没A
后面看到汪神的代码更加崩溃
附汪神代码:
#include<cstdio>
#include<algorithm>
using namespace std;
char ch;
int query()
{
int ans = 0, num = 0;
while (true)
{
ch = getchar();
if (ch == 'a') ++num;
else
if (ch == '(') num += query();
else
if (ch == ')') return ans = max(ans, num);
else
if (ch == '|') ans = max(ans, num), num = 0;
else
if (ch == EOF) return ans = max(ans, num);
}
}
int main()
{
freopen("Text.txt", "r", stdin);
return printf("%d\n", query()) * 0;
}