题意:

输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式, 
其中p、q、r、s
、t的值为1(true)或0(false),即逻辑变量;
K、A、N、C、E为逻辑运算符,
K --> and:x && y
A --> or:x || y
N --> not :! x 
C --> implies :(!x)||y
E --> equals :x==y 
问这个逻辑表达式是否为永真式。

题解:

用32进行位操作   判断五个逻辑变量 的真假

这里面 要注意一个小点 必须用 & 不可以用 &&  必须用 | 不可以用||

&& 和 || 有短路性质

eg.在运行上,&两边的条件都要判断(不管前面的是ture还是false),而&&先判断前面的,若为false,则后面的不再判断。

/*
Algorithm: 暴力枚举 
Author: anthony1314
Creat Time: 2019. 3 . 21 
Time Complexity:
*/

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cstring>
#include<cstdio>
//#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define mod 1e9 + 7
#define line printf("--------------");
using namespace std;

int cnt;
char str[101];
bool step(char str[101],int tk) {
	cnt++;
	switch(str[cnt]) {
		case 'p':
			return tk&1;
		case 'q':
			return(tk>>1)&1;
		case 'r':
			return(tk>>2)&1;
		case 's':
			return(tk>>3)&1;
		case 't':
			return(tk>>4)&1;
		case 'N':
			return !step(str,tk);
		case 'K':
			return step(str,tk)&step(str,tk);
		case 'A':
			return step(str,tk)|step(str,tk);
		case 'C':
			return !step(str,tk)|step(str,tk);
		case 'E':
			return step(str,tk)==step(str,tk);
	}
}
bool judge(char str[101]) {
	for(int i = 0; i < 32; i++) {
		cnt = -1;//初始化 
		if(!step(str,i)) {
			return 0;
		}
	}
	return 1;
}
int main() {
	while(cin>>str) {
		if(str[0]=='0'){
			 break;
		}
		if(judge(str)){
			cout<<"tautology"<<endl;
		}
		else{
			cout<<"not"<<endl;
		}
	}
	return 0;
}
/*
&是位运算符。&&是布尔逻辑运算符。
在运行上,&两边的条件都要判断(不管前面的是ture还是false),而&&先判断前面的,若为false,则后面的不再判断。

*/