本題第一難點:字符串處理
方法一:純模擬,時間復雜度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 }
