这个题基本思路是枚举各个事件的真值,枚举的思路有两个:
1.利用离散数学主合取范式的01表达方式,如果事件有3种,真值取法有000,001,010,011,100,101,110,111转化为10进制是0,1,2,3,4,5,6,7=2^3-1
2 dfs(),
#include<cstdio> #include<iostream> #include<cstring> #include<stack> #include<cctype> using namespace std; int sign[26],vis[26],letter[26],count; char str[120]; int cmp() { // for(int i=0; i<26; i++) //if(vis[i]) //cout<<char(i+'a')<<" "<<sign[i]<<endl; stack<int>st; for(int i=strlen(str)-1; i>=0; i--) { if(islower(str[i])) st.push(sign[str[i]-'a']); else { int u,v; switch (str[i]) { case 'C': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push(u&&v); break; case 'D': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push(u||v); break; case 'I': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push(!u||v); break; case 'E': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push((!u||v)&(!v||u)); break; case 'N': u=st.top(); st.pop(); st.push(!u); break; default: break; } } } return st.top(); } int main() { //freopen("in.txt","r",stdin); int cas,flag; scanf("%d",&cas); getchar (); while(cas--) { //fgets(str,120,stdin); cin>>str; memset(vis,0,sizeof(vis)); count=0; for(int i=0; str[i]!='\0'; i++) if(islower(str[i])) { if(!vis[str[i]-'a']) letter[count++]=str[i]-'a'; vis[str[i]-'a']=1; } int a; a=(1<<(count))-1; flag=0; while(a>=0) { int aa=a,temp=0; memset(sign,0,sizeof(sign)); while(aa) { sign[letter[temp++]]=aa%2; aa/=2; } if(!cmp()) { flag=1; break; } a--; } if(flag) cout<<"NO\n"; else cout<<"YES\n"; } return 0; }
#include<cstdio> #include<iostream> #include<cstring> #include<stack> #include<cctype> using namespace std; int sign[26],vis[26],letter[26],count; char str[120]; int cmp() { //for(int i=0; i<26; i++) // if(vis[i]) // cout<<char(i+'a')<<" "<<sign[i]<<endl; stack<int>st; for(int i=strlen(str)-1; i>=0; i--) { if(islower(str[i])) st.push(sign[str[i]-'a']); else { int u,v; switch (str[i]) { case 'C': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push(u&&v); break; case 'D': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push(u||v); break; case 'I': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push(!u||v); break; case 'E': u=st.top(); st.pop(); v=st.top(); st.pop(); st.push((!u||v)&(!v||u)); break; case 'N': u=st.top(); st.pop(); st.push(!u); break; default: break; } } } return st.top(); } bool dfs(int cur) { sign[cur]=1; int next,flag=0; for(int i=cur+1; i<=25; i++) if(vis[i]) { flag=1; next=i; break; } if(flag) { if(!dfs(next)) return false; else { sign[cur]=0; if(!dfs(next)) return false; } } else { int a; a=cmp(); if(!a) return false; else { sign[cur]=0; a=cmp(); if(!a) return false; } } return true; } int main() { //freopen("in.txt","r",stdin); int cas; scanf("%d",&cas); getchar (); while(cas--) { //fgets(str,120,stdin); cin>>str; memset(vis,0,sizeof(vis)); count=0; for(int i=0; str[i]!='\0'; i++) if(islower(str[i])) vis[str[i]-'a']=1; for(int i=0; i<=25; i++) { if(vis[i]) { if(dfs(i)) cout<<"YES\n"; else cout<<"NO\n"; break; } } } return 0; }