Luogu P1310 表示式的值

2021-08-29 05:05:55 字數 1658 閱讀 8016

對於1 位二進位制變數定義兩種運算:

運算的優先順序是:

先計算括號內的,再計算括號外的。

「× 」運算優先於「⊕」運算,即計算表示式時,先計算× 運算,再計算⊕運算。例如:計算表示式a⊕b × c時,先計算 b × c,其結果再與 a 做⊕運算。

現給定乙個未完成的表示式,例如_+(_*_),請你在橫線處填入數字00或者11 ,請問有多少種填法可以使得表示式的值為00。

輸入格式:

共 2 行。

第1 行為乙個整數 ll,表示給定的表示式中除去橫線外的運算子和括號的個數。

第2 行為乙個字串包含 ll 個字元,其中只包含』(』、』)』、』+』、』*』這44 種字元,其中』(』、』)』是左右括號,』+』、』*』分別表示前面定義的運算子「⊕」和「×」。這行字元按順序給出了給定表示式中除去變數外的運算子和括號。

輸出格式:

共1 行。包含乙個整數,即所有的方案數。注意:這個數可能會很大,請輸出方案數對1000710007取模後的結果。

輸入樣例#1:複製

4

+(*)

輸出樣例#1:複製

【輸入輸出樣例說明】

給定的表示式包括橫線字元之後為:_+(_*_) 

在橫線位置填入(0 、0 、0) 、(0 、1 、0) 、(0 、0 、1) 時,表示式的值均為0 ,所以共有3種填法。 

【資料範圍】

對於20\%20% 的資料有0 ≤ l ≤ 100≤l≤10。

對於50\%50% 的資料有 0 ≤ l ≤ 1,0000≤l≤1,000。

對於70\%70% 的資料有0 ≤ l ≤ 10,0000≤l≤10,000 。

對於100\%100%的資料有0 ≤ l ≤ 100,0000≤l≤100,000。

對於50\%50% 的資料輸入表示式中不含括號。

棧+dp

開兩個棧:數字棧,符號棧

注意:)後面沒有數字,(前沒有數字

#includeconst int p=10007;

using namespace std;

const int n=1e6+5;

char s[n],st[n];

int n,t1,t2,f[n][2];

inline int level(char ch)

inline void calc(char ch)

else if(ch=='*')

t1--;

}int main()

else

if(s[i]=='*')

else

if(s[i]=='(')st[++t2]='(';

else

if(s[i]==')')

}if(s[n]!=')') f[++t1][0]=1,f[t1][1]=1;

while(t2) calc(st[t2--]);

printf("%d\n",f[1][0]);

return 0;

}

P1310 表示式的值

原題鏈結 water lift 一波講解,然後我們就會了這個題,然後我們就要寫部落格啦qwq 這是個布林表示式基計數問題。這個其實 就是 或運算,就是 與運算。我們將這個式子通俗得看成 x y 和 x y 我們設x0是使x為0的方案數,x1是使x為1的方案數 y0是使y為0的方案數,y1是使y為1的...

資料結構 P1310 表示式的值

題目鏈結 對於1 位二進位制變數定義兩種運算 運算的優先順序是 先計算括號內的,再計算括號外的。運算優先於 運算,即計算表示式時,先計算 運算,再計算 運算。例如 計算表示式a b c時,先計算 b c,其結果再與 a 做 運算。現給定乙個未完成的表示式,例如 請你在橫線處填入數字00或者11 請問...

洛谷 P1310 表示式的值(棧 DP)

首先因為有優先順序和括號,可以先把表示式化成字尾表示式的形式,其中用 表示這乙個點是數字。用u記錄得到0的方案數,v記錄得到1的方案數。設兩個步驟的運算結果經過每個符號到乙個結果時,第乙個運算結果算出0的方案數為t1,1的方案數為t2。第二個算出0的方案數為t3,算出1的方案數為t4。則有 當符號是...