您的位置:首页 > 其它

POJ 3295

2011-11-07 17:00 246 查看
看完这个题目后,果断没思路了,看了一下discuss,百度了一下,知道了什么是后缀式,前缀式,然后用后缀式+stack+位枚举水过了。

换成C++提交

MDK3295Accepted172K0MSC++2636B2011-11-07 16:59:54
0ms亲~~

POJ 3295

MDK3295Accepted704K16MSG++2636B2011-11-07 16:55:58
stack<bool> st;
char ss[MAXN];
int len = 0;
bool p, q, r, s, t;

bool get_bit(int t,int x) {
//    在 t 中,取出第 x 位     --从零开始
return t & (1<<(x));
}

bool Ant() {
bool tmp,tmpp;
while(len!=-1)
switch(ss[len--]) {
case 'p':    st.push(p);    break;
case 'q':    st.push(q);    break;
case 'r':    st.push(r);    break;
case 's':    st.push(s);    break;
case 't':    st.push(t);    break;
case 'N':
tmp = st.top();st.pop();
st.push(!tmp);            break;

case 'A':
tmp = st.top();st.pop();tmpp = st.top();st.pop();
st.push(tmp || tmpp);        break;

case 'K':
tmp = st.top();st.pop();tmpp = st.top();st.pop();
st.push(tmp && tmpp);        break;

case 'C':
tmp = st.top();st.pop();tmpp = st.top();st.pop();
st.push(!tmp | tmpp);        break;

case 'E':
tmp = st.top();st.pop();tmpp = st.top();st.pop();
st.push(tmp == tmpp);        break;
}
return st.top();
}

int main () {
FOPEN
while(~SCFS(ss)) {
if(ss[0] == '0') {
break;
}

int lent = strlen(ss);
int sum = 64;
bool mark = 0;
for(int i = 0;i<sum;i++) {
len=lent - 1;SETQ(st);
p = get_bit(i,0);
q = get_bit(i,1);
r = get_bit(i,2);
s = get_bit(i,3);
t = get_bit(i,4);
int ans = Ant();
if( ans == 0) {
mark = 1;
break;
}
}
if(mark) {
puts("not");
} else {
puts("tautology");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: