题目链接:http://poj.org/problem?id=3295
题中所给的p,q,r,s,t是bool值,可取0或者1。
还有五中运算符:K,A,N,C,E:分别是
Kab---->a&&b
Aab---->a||b
Na----->!a
Cab---->(!a)||b
Eab----->a==b
给你一个这种带运算符和bool值得式子,判断是否这个式子是永远为真的,是的话输出tautology,否则输出not。
首先为了判断某个式子是否为真,那么我们就得讲p,q,r,s,t这五个变量所有的取值都试一遍,如果全部取值使得最终结果都为真,那么说明该式子是为真的。
其实这题跟那个用栈来实现带优先级的运算是很像的,每次我们先从最后一个变量开始取值并运算,得出的结果再放入栈中,直到最后栈中只含有一个元素,那就是最终的结果,一旦发现某个值不为真,那么说明这个式子不是永真的,跳出判断即可。
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<set>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
#define ll __int64
int n,m;
int p,q,r,s,t;
char ch[110];
stack<int>sk;
bool isVar(char c){ //取值入栈
if(c == 'p'){
sk.push(p);
return true;
}else if(c=='q'){
sk.push(q);
return true;
}else if(c=='r'){
sk.push(r);
return true;
}else if(c=='s'){
sk.push(s);
return true;
}else if(c=='t'){
sk.push(t);
return true;
}
return false;
}
void opera(char c){ //运算
int val1,val2;
int res;
if(c=='K'){
val1 = sk.top();
sk.pop();
val2 = sk.top();
sk.pop();
res = (val1&&val2);
sk.push(res);
}else if(c == 'A'){
val1 = sk.top();
sk.pop();
val2 = sk.top();
sk.pop();
res = (val1 || val2);
sk.push(res);
}else if(c == 'N'){
val1 = sk.top();
sk.pop();
res = (!val1);
sk.push(res);
}else if(c == 'C'){
val1 = sk.top();
sk.pop();
val2 = sk.top();
sk.pop();
res = ((!val1)||val2);
sk.push(res);
}else if(c == 'E'){
val1 = sk.top();
sk.pop();
val2 = sk.top();
sk.pop();
res = (val1==val2);
sk.push(res);
}
}
int main(){
// freopen("in.txt","r",stdin);
while(sfs(ch)!=EOF){
while(!sk.empty())
sk.pop();
if(ch[0]=='0') break;
int len = strlen(ch);
int flag=1,ans;
for(p=0;p<=1;p++){
for(q=0;q<=1;q++){
for(r=0;r<=1;r++){
for(s=0;s<=1;s++){
for(t=0;t<=1;t++){
for(int i=len-1;i>=0;i--){
if(!isVar(ch[i]))
opera(ch[i]);
}
ans = sk.top(); //最后的结果
sk.pop();
if(!ans){ //不为真
flag=0;
break;
}
}
if(!flag) break;
}
if(!flag) break;
}
if(!flag) break;
}
if(!flag) break;
}
if(flag)
printf("tautology\n");
else
printf("not\n");
}
return 0;
}