MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 3295

Posted on 2011-11-07 17:00  MDeath-Kid  阅读(340)  评论(0)    收藏  举报

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

换成C++提交

MDK 3295 Accepted 172K 0MS C++ 2636B 2011-11-07 16:59:54

 0ms亲~~

POJ 3295
MDK 3295 Accepted 704K 16MS G++ 2636B 2011-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");
}
}
}