#include #include #include #include void myprint(std::stack my); void solve(int n,char data[81]); char myNot(char c); int myVer(char c); char myAnd(char c1,char c2); char myOr(char c1,char c2); char myChar(char c); std::stack mystack; std::map rank; int r,q,p; int main() { char data[81]; int n; scanf("%s",data); n=strlen(data); rank['P']=rank['Q']=rank['R']=0; rank['0']=rank['1']=rank['2']=0; rank[0]=rank[1]=rank[2]=0; rank['+']=1; rank['*']=2; rank['-']=3; rank['(']=4; rank[')']=-1; while(!(data[0]=='.' && n==1)){ solve(n,data); scanf("%s",data); n=strlen(data); } } void solve(int n,char data[81]){ int point=0; int nowRank=0; char ts[4]; int count=0; bool kakkoFlag=false; for(r=0;r<3;r++){ for(p=0;p<3;p++){ for(q=0;q<3;q++){ while(mystack.empty()==false) mystack.pop(); point=1; mystack.push(myVer(data[0])); nowRank=rank[data[0]]; while(point<=n) { if(n==point || nowRank>rank[data[point]]) { if(point1) { //if(p==0 && r==0 && q==0)myprint(mystack); ts[0]=mystack.top(); mystack.pop(); ts[1]=mystack.top(); mystack.pop(); nowRank=rank[ts[1]]; if(ts[1]=='('){ //printf(""); if(ts[0]=='('){ mystack.push(ts[1]); if(kakkoFlag==false){ mystack.push(ts[0]); break; } kakkoFlag=false; }else if(ts[0]=='-'){ mystack.push(ts[1]); mystack.push(ts[0]); break; }else{ if(kakkoFlag==true){ mystack.push(ts[0]); kakkoFlag=false; }else{ mystack.push(ts[1]); mystack.push(ts[0]); break; } } }else if(ts[1]=='-'){ //printf(""); if(ts[0]=='-'){ break; }else if(ts[0]=='('){ mystack.push('-'); mystack.push('('); break; }else{ mystack.push(myNot(ts[0])); } }else if(ts[1]=='+' || ts[1]=='*'){ if(ts[0]=='-' || ts[0]=='('){ //printf(""); mystack.push(ts[1]); mystack.push(ts[0]); break; }else{ //printf("",ts[0],ts[1]); ts[2]=mystack.top(); mystack.pop(); if(ts[1]=='+'){ ts[0]=myOr(ts[2],ts[0]); }else if(ts[1]=='*'){ ts[0]=myAnd(ts[2],ts[0]); } mystack.push(ts[0]); } }else{ //printf(""); mystack.push(ts[1]); mystack.push(ts[0]); break; } } nowRank=rank[mystack.top()]; point++; }else{ if(n>point){ mystack.push(data[point]); nowRank=rank[mystack.top()]; point++; } } } if(myVer(mystack.top())==2) count++; //printf("%d ",mystack.top()); } } } printf("%d\n",count); } void myprint(std::stack my){ std::stack nt; while(my.empty()==false){ nt.push(my.top()); my.pop(); } while(nt.empty()==false){ my.push(nt.top()); printf("%c",myChar(nt.top())); nt.pop(); } printf("\n"); } char myChar(char c){ if(3>c && c>=0) return c+'0'; return c; } char myNot(char c){ int t=myVer(c); if(t==2){ return 0; }else if(t==1){ return 1; }else if(t==0){ return 2; } return c; } int myVer(char c){ int t=c; if(c=='R'){ t=r; }else if(c=='P'){ t=p; }else if(c=='Q'){ t=q; }else if('3'>c && c>='0'){ t=c-'0'; } return t; } char myAnd(char c1,char c2){ char t[3][4]={"000","011","012"}; return myVer(t[myVer(c1)][myVer(c2)]); } char myOr(char c1,char c2){ char t[3][4]={"012","112","222"}; return myVer(t[myVer(c1)][myVer(c2)]); }