UAPC 2011 E SAT-EN-3
問題
(B&B&f)|(~d&~i&i)|(~v&i&~V)|(~g&~e&o)|(~f&d&~v)|(d&~i&o)|(g&i&~B)|(~i&f&d)|(e&~i&~V)|(~v&f&~d)
みたいな式を満たす変数の割り当てがあるか、yesかnoで答える。
方針
どれか一つの節が満たされればいい。節ごとに考える。
A&~Aが含まれるとき、その節は満たされない。
そうでないとき、その節は満たすことができる。
ソースコード
int parse(string s){ char c=s[s.size()-1]; int ret=0; if(isupper(c))ret=c-'A'+26; else ret=c-'a'; ret*=2; if(s.size()==2)ret++; return ret; } bool ck(int a,int b){ if(a/2==b/2&&a%2!=b%2)return 1; return 0; } string in,s; int main(){ while(getline(cin,in),in!="#"){ rep(i,in.size())if(in[i]=='('||in[i]==')'||in[i]=='|')in[i]=' '; stringstream ss(in); while(ss>>s){ int a,b,c; rep(i,s.size())if(s[i]=='&')s[i]=' '; stringstream tt(s); string x,y,z; tt>>x>>y>>z; a=parse(x); b=parse(y); c=parse(z); //cerr<<x<<" "<<y<<" "<<z<<endl; if(ck(a,b)||ck(b,c)||ck(c,a))continue; else{ cout<<"yes"<<endl; goto END; } } cout<<"no"<<endl; END:; } return 0; }