AT_kupc2015_f.逆ポーランド記法

通过率:0%

AC君温馨提醒

该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

问题描述

有一种算式的表达方法被称作逆波兰表达式。在这个问题中,单个数字(0−90-9)和加减乘三个双目运算符(+-*)被称作“令牌”(token)。我们以一串“令牌”组成字符串来表达一个逆波兰式。

举个例子。如果有一个逆波兰记法的表达式 32−1+32-1+,这个表达式的中缀表达式为 (3−2)+1(3-2)+1,计算的结果为 22。逆波兰表达式的计算方法的伪代码如下给出:

calc(s)
{
    初始化一个空的X
    for (i in [0 .. |s|-1])
    {
        if (s[i]是数字)
        {
            X.push(s[i])
        }
        else
        {
            r = X.pop()
            l = X.pop()
            求出l和r按照运算符s[i]计算的结果记作a
            X.push(a)
        }
    }
    ans = X.pop()
    return ans
}

该程序的输入 ss 是一个逆波兰式的字符串。s[i](0≤i≤∣s∣−1)s[i]\quad(0\leq i\leq |s|-1) 指 ss 的第 i+1i+1 “令牌”。

“求出 ll 和 rr 按照运算符 s[i]s[i] 计算的结果记作a”的意思是:ll 为左运算数,rr 为右运算数,运算符为 s[i]s[i],进行加 / 减 / 乘的运算。比如当 s[i]s[i] 为 - 时,要进行的运算(用中缀表达式表达)为 l−rl-r。

应该注意的是:构造后 XX 的 push / pop 操作的有关值均在 00 到 99 的范围的限制之内。当 XX 为空时对其进行 pop 操作将会导致程序产生错误而停止,不会得到计算的输出。

如果上述代码中构造的 XX 是一个栈,那么就应该能正确的计算一个逆波兰表达式;如果错误地使用队列则不能正确的计算。如果将输入的式子进行重新的排列,用队列的程序就应该能够输出正确答案。

我们将 XX 为栈的程序称为“SS 程序”, XX 为队列的程序为“QQ 程序”。

给定一个逆波兰式 AA,要求求出符合以下条件的 BB:

  • BB 是 AA 的一个排列
  • 以 BB 为输入的 “QQ 程序”不会产生错误
  • 以 BB 为输入的 “QQ 程序”的输出与以 AA 为输入的“SS 程序”的输出相等。

输入格式

一行逆波兰式的字符串 AA:

A

输出格式

一行满足题目要求的字符串 BB(如有多个符合条件的 BB,任意输出一个):

B

样例输入输出

样例一

输入

54-

输出

45-

样例二

输入

321+-

输出

12+3-

样例三

输入

2

输出

2

说明/提示

  • 样例一:对于输入的 AA 54-,仅有一个符合条件的 BB 为 45-
  • 样例二:输入 321+- 时,“SS 程序”得到的中缀表达式为 3-(2+1),最终的输出为 00。
  • 样例三:单个数字的字符串也是一个正确的逆波兰式。
    • 1≤A≤1001\leq A\leq100
    • AA 是仅含有 0123456789+-* 的字符串
    • 保证 AA 是合法的逆波兰式。
  • 题目来源:京都大学2015程序大赛

输入解题思路,AI测评打分。不知道怎么写?

首页