spoj 147

来源:互联网 发布:形容网络发达的句子 编辑:程序博客网 时间:2024/05/18 12:01

dfs枚举真值 

#include <cstdio>#include <cstring>#include <cstdlib>#include <stack>using namespace std;char s[120];bool ch[30];bool b[30];int cur[30];int len;int dfs(int m, int mm){    if(m == mm)    {        stack<bool> q;        for(int i = len-1; i >= 0; i--)        {            if(s[i] >= 'a' && s[i] <= 'z')            {                q.push(b[cur[s[i]-'a'+1]]);            }            else            {                if(s[i] == 'C')                {                    bool x,y;                    x = q.top(), q.pop();                    y = q.top(), q.pop();                    q.push(x && y);                }                else if(s[i] == 'D')                {                    bool x,y;                    x = q.top(), q.pop();                    y = q.top(), q.pop();                    q.push(x || y);                }                else if(s[i] == 'I')                {                    bool x,y;                    x = q.top(), q.pop();                    y = q.top(), q.pop();                    q.push((!x) || y);                }                else if(s[i] == 'E')                {                    bool x,y;                    x = q.top(), q.pop();                    y = q.top(), q.pop();                    q.push(((!x) || y) && ((!y) || x));                }                else                {                    bool x;                    x = q.top(), q.pop();                    q.push(!x);                }            }        }        return q.top();    }    else    {        b[m] = true;        if(dfs(m+1, mm))        {            b[m] = false;            return dfs(m+1, mm);        }    }    return false;}int main(){    int n;    scanf("%d",&n);    while(n--)    {        memset(ch, false, sizeof(ch));        memset(b, false, sizeof(b));        scanf("%s",s);        len = strlen(s);        for(int i = len-1; i >= 0; i--)        {            if(s[i] >= 'a' && s[i] <= 'z')                ch[s[i] - 'a'+1] = true;        }        int e = 1;        for(int i = 1; i <= 26; i++)            if(ch[i])               cur[i] = e++;        if(dfs(1, e))            puts("YES");        else            puts("NO");    }    return 0;}

 

原创粉丝点击