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;
}