洛谷P1054等價表示式題解 zhengjun

2021-10-05 03:05:28 字數 3061 閱讀 5172

題目描述

明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。

這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算機來解決這個問題。假設你是明明,能完成這個任務嗎?

這個選擇題中的每個表示式都滿足下面的性質:

表示式只可能包含乙個變數『a

aa』。

表示式**現的數都是正整數,而且都小於10000

10000

10000。

表示式中可以包括四種運算+

++(加),−

-−(減),∗

*∗(乘),^ (乘冪),以及小括號(

((,)

))。小括號的優先順序最高,其次是^ ,然後是∗

*∗,最後是+

++和−

-−。+

++和−

-−的優先順序是相同的。相同優先順序的運算從左到右進行。(注意:運算子+

++,−

-−,∗

*∗,^ 以及小括號(

((,)

))都是英文本元)

冪指數只可能是1

11到10

1010

之間的正整數(包括1

11和10

1010

)。表示式內部,頭部或者尾部都可能有一些多餘的空格。

下面是一些合理的表示式的例子:

(

(a^1)^

2)^3

,a*a+a-a,

((a+a)),

9999

+(a-a)

*a,1

+(a -1)

^3,1

^10^9………

輸入格式

第一行給出的是題幹中的表示式。

第二行是乙個整數n(2

≤n≤26

)n(2 \le n \le 26)

n(2≤n≤

26),表示選項的個數。後面n

nn行,每行包括乙個選項中的表示式。這n

nn個選項的標號分別是a,b

,c,d

⋯a,b,c,d\cdots

a,b,c,

d⋯輸入中的表示式的長度都不超過50

5050

個字元,而且保證選項中總有表示式和題幹中的表示式是等價的。

輸出格式

一行,包括一系列選項的標號,表示哪些選項是和題幹中的表示式等價的。選項的標號按照字母順序排列,而且之間沒有空格。

輸入輸出樣例

輸入 #1 複製

( a +1)

^23(a-1)

^2+4

*aa +

1+ aa^2

+2* a *1+

1^2+

10-10+a -a

輸出 #1 複製
ac
說明/提示

對於30

%30\%

30%的資料,表示式中只可能出現兩種運算子+

++和−-−;

對於其它的資料,四種運算子+

++,−

-−,∗

*∗,^ 在表示式中都可能出現。

對於全部的資料,表示式中都可能出現小括號(

((和)))。

2005

2005

2005

年提高組第四題

特別想吐槽一下這道題

資料又特別水,值還很大,題目中沒說表示式的括號一定匹配,所以要判斷,我無語了

首先,我判斷兩個表示式相等的依據就是代入不同的值,如果結果都一樣,那麼這兩個表示式就是等價的。如果還沒有學過表示式求值的話,建議先去看看棧的實現。

然後,這道題的資料水到什麼程度,我代特值,只要代乙個1

11,就可以得到80

8080

分,然後,代兩個1,2

1,21,

2就滿分了,我諤諤,答案還特別大,需要取模,告訴你我取模是靠傳說中的ran

d(

)rand()

rand()

,真香。

#include

using

namespace std;

int mod;

/********以下是表示式求值********/

map<

char

,int

> p;

int a[

1001

],aa,bb;

char b[

1001];

void

init()

intpow

(int x,

int y)

return ans;

}voidjs(

)case

'-':

case

'*':

case

'/':

case

'^':

} a[

++aa]

=z;}

intget

(string s,

int k)

if(s[i]

=='a')if

(s[i]

>=

'0'&&s[i]

<=

'9')

if(s[i]

=='('

)while

(bb>

0&&p[s[i]

]<=p[b[bb]])

js();

}if(s[i]

!=')'

)b[++bb]

=s[i]

; i++;}

return a[1]

;}/********以上是表示式求值********/

bool

check

(string s)

return top==0;

}int

main()

cout

}

洛谷 P1054 等價表示式

題目描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是...

P1054 等價表示式

目錄 實現 等價表示式 給出乙個表示式,求之後給出的與之等價的表示式。保證每個表示式最多只有乙個變數 a 可能有 運算。由於只有乙個變數,我們可以將 a 特殊值化,如果最終結果相同那麼判定兩式等價。為了減小誤差,我們可以多取幾個值,但是由於有乘方操作所以最好不要太大。之後就是中綴表示式的計算,我採用...

洛谷 1054 NOIP2005 等價表示式

明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算...