CSP2020-j2 T3表達式(expr)


本題第一難點:字符串處理

方法一:純模擬,時間復雜度O(q*|s|)~估計分數30左右

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[1000010];
 4 char c;
 5 int len;
 6 int n, a[100010];
 7 int q, qx;
 8 int stk[1000010], t;//手寫棧,t來記錄棧頂下標 
 9 void cal(int f) {
10     int p=0;//p記錄第幾個X(數),按要求更改取反 
11     t=0;
12     for(int i=0; i<len; i++) {
13         if(s[i]=='x') {
14             p++;
15             i++;//遇到x從之后開始將數字字符轉換為數字 
16             int x=0;//計算x之后的數值,並從對應數組中取值,存於x中 
17             while(s[i]!=' ') {//此處是該題中的難點 
18                 x=x*10+s[i]-'0';
19                 i++;
20             }
21             i--;//i值恢復到之前 
22             if(p==f) {//要求取反的下標 
23                 ++t;
24                 stk[t]=!a[x];
25             } else {
26                 ++t;
27                 stk[t]=a[x];
28             }
29         }
30         if(s[i]=='!') {
31             stk[t] = !stk[t];
32         }
33         if(s[i]=='&') {
34             int temp1=stk[t];//寫成這樣方便調試 
35             t--;
36             int temp2=stk[t];
37             stk[t] = temp1 & temp2;
38         }
39         if(s[i]=='|') {
40             int temp1=stk[t];
41             t--;
42             int temp2=stk[t];
43             stk[t] = temp1 | temp2;
44         }
45     }
46     cout<<stk[t]<<endl;
47 }
48 int main() {
49 
50     while((c=getchar())!='\n')
51         s[len++]=c;
52 //    for(int i=0; i<len; i++)cout<<s[i];//測試輸入代碼 
53 //    cout<<endl;//測試輸入代碼
54     cin>>n;
55     for(int i=1; i<=n; i++)
56         cin>>a[i];
57     cin>>q;
58     while(q--) {
59         cin>>qx;
60         cal(qx);//用於傳遞第幾個數取反
61     }
62     return 0;
63 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM