#include<iostream> #include<vector> #include<queue> using namespace std; struct slowo { int st; vector<int>gdzie; }; struct zdanie { int war,p,k; vector<int>wyg; vector<bool>neg; }; slowo x[1000002]; zdanie kl[1000002]; queue<int>Q; vector<string>zak[1000002]; long long dw[1000002], mod=1000000007; string w; int n, il, wyr; bool czy=false; int main() { ios_base::sync_with_stdio(0); getline( cin, w ); for(int i=0; i<w.size(); i++) { n*=10; n+=w[i]-'0'; } getline( cin, w ); dw[1]=1; for(int i=2; i<=n; i++)dw[i]=dw[i-1]*2%mod; for(int i=0; i<=n; i++)x[i].st=3; for(int i=0; i<w.size(); i++) { i++; if(w[i]=='~') { kl[il].neg.push_back(1); i++; } else kl[il].neg.push_back(0); wyr=0; i++; while(w[i]>='0'&&w[i]<='9') { wyr*=10; wyr+=w[i]-'0'; i++; } x[wyr].gdzie.push_back(il); kl[il].wyg.push_back(wyr); kl[il].war++; if(kl[il].war==1) { kl[il].p=wyr; kl[il].k=wyr; } else { if(wyr<kl[il].p)kl[il].p=wyr; if(wyr>kl[il].k)kl[il].k=wyr; } if(w[i]==')') { il++; i+=3; } else i++; } /* for(int i=0; i<il; i++) { cout<<"Poczatek: "<<kl[i].p<<" Koniec: "<<kl[i].k<<" Ilosc: "<<kl[i].war<<"\n"; for(int j=0; j<kl[i].war; j++) { if(kl[i].neg[j])cout<<"Negacja "; cout<<"wyrazenie "<<kl[i].wyg[j]<<"\n"; } } for(int i=1; i<=n; i++) { cout<<i<<" wsytepuje: "; for(int j=0; j<x[i].gdzie.size(); j++)cout<<x[i].gdzie[j]<<" "; cout<<"\n"; } */ for(int i=0; i<il; i++)if(kl[i].war==1)Q.push(i); while(!Q.empty()) { wyr=Q.front(); Q.pop(); czy=false; for(int i=0; i<kl[wyr].wyg.size(); i++)if(x[kl[wyr].wyg[i]].st==1&&kl[wyr].neg[i]==0)czy=true; for(int i=0; i<kl[wyr].wyg.size(); i++)if(x[kl[wyr].wyg[i]].st==0&&kl[wyr].neg[i]==1)czy=true; if(!czy)for(int i=0; i<kl[wyr].wyg.size(); i++) { if(x[kl[wyr].wyg[i]].st==3) { if(kl[wyr].neg[i])x[kl[wyr].wyg[i]].st=0; else x[kl[wyr].wyg[i]].st=1; for(int j=0; j<x[kl[wyr].wyg[i]].gdzie.size(); j++) { kl[x[kl[wyr].wyg[i]].gdzie[j]].war--; if(kl[x[kl[wyr].wyg[i]].gdzie[j]].war==1)Q.push(x[kl[wyr].wyg[i]].gdzie[j]); } break; } } } wyr=1; for(int i=1; i<=n; i++)if(x[i].st==3)wyr++; cout<<dw[wyr]; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include<iostream> #include<vector> #include<queue> using namespace std; struct slowo { int st; vector<int>gdzie; }; struct zdanie { int war,p,k; vector<int>wyg; vector<bool>neg; }; slowo x[1000002]; zdanie kl[1000002]; queue<int>Q; vector<string>zak[1000002]; long long dw[1000002], mod=1000000007; string w; int n, il, wyr; bool czy=false; int main() { ios_base::sync_with_stdio(0); getline( cin, w ); for(int i=0; i<w.size(); i++) { n*=10; n+=w[i]-'0'; } getline( cin, w ); dw[1]=1; for(int i=2; i<=n; i++)dw[i]=dw[i-1]*2%mod; for(int i=0; i<=n; i++)x[i].st=3; for(int i=0; i<w.size(); i++) { i++; if(w[i]=='~') { kl[il].neg.push_back(1); i++; } else kl[il].neg.push_back(0); wyr=0; i++; while(w[i]>='0'&&w[i]<='9') { wyr*=10; wyr+=w[i]-'0'; i++; } x[wyr].gdzie.push_back(il); kl[il].wyg.push_back(wyr); kl[il].war++; if(kl[il].war==1) { kl[il].p=wyr; kl[il].k=wyr; } else { if(wyr<kl[il].p)kl[il].p=wyr; if(wyr>kl[il].k)kl[il].k=wyr; } if(w[i]==')') { il++; i+=3; } else i++; } /* for(int i=0; i<il; i++) { cout<<"Poczatek: "<<kl[i].p<<" Koniec: "<<kl[i].k<<" Ilosc: "<<kl[i].war<<"\n"; for(int j=0; j<kl[i].war; j++) { if(kl[i].neg[j])cout<<"Negacja "; cout<<"wyrazenie "<<kl[i].wyg[j]<<"\n"; } } for(int i=1; i<=n; i++) { cout<<i<<" wsytepuje: "; for(int j=0; j<x[i].gdzie.size(); j++)cout<<x[i].gdzie[j]<<" "; cout<<"\n"; } */ for(int i=0; i<il; i++)if(kl[i].war==1)Q.push(i); while(!Q.empty()) { wyr=Q.front(); Q.pop(); czy=false; for(int i=0; i<kl[wyr].wyg.size(); i++)if(x[kl[wyr].wyg[i]].st==1&&kl[wyr].neg[i]==0)czy=true; for(int i=0; i<kl[wyr].wyg.size(); i++)if(x[kl[wyr].wyg[i]].st==0&&kl[wyr].neg[i]==1)czy=true; if(!czy)for(int i=0; i<kl[wyr].wyg.size(); i++) { if(x[kl[wyr].wyg[i]].st==3) { if(kl[wyr].neg[i])x[kl[wyr].wyg[i]].st=0; else x[kl[wyr].wyg[i]].st=1; for(int j=0; j<x[kl[wyr].wyg[i]].gdzie.size(); j++) { kl[x[kl[wyr].wyg[i]].gdzie[j]].war--; if(kl[x[kl[wyr].wyg[i]].gdzie[j]].war==1)Q.push(x[kl[wyr].wyg[i]].gdzie[j]); } break; } } } wyr=1; for(int i=1; i<=n; i++)if(x[i].st==3)wyr++; cout<<dw[wyr]; return 0; } |