#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <assert.h>
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
string ss;
vector<char> vector1;
stack<char> stack1;
int pos;
bool cmp(char a) {
return a == vector1[pos];
}
char getres(char op, char a, char b) {
switch (op) {
case 'K':
if (a == '1' && b == '1')
return '1';
return '0';
case 'A':
if (a == '1' || b == '1')
return '1';
return '0';
case 'C':
if (a == '1' && b == '0')
return '0';
return '1';
case 'E':
bool flag;
flag = a == b;
if (flag)
return '1';
return '0';
default:
break;
}
}
bool computeExp(string &s) {
//这道题目可以看成是一道前缀表达式的计算问题,用栈来模拟式最合适的
for (int i = s.size() - 1; i >= 0; i--) {
if (isupper(s[i])) {//说明是一个运算符号
if (ss[i] == 'N') {
char a = stack1.top();
stack1.pop();
a = (a == '1') ? '0' : '1';
stack1.push(a);
} else {
char a = stack1.top();
stack1.pop();
char b = stack1.top();
stack1.pop();
stack1.push(getres(s[i], a, b));
}
} else{
stack1.push(s[i]);
}
}
assert(stack1.size()==1);
char res = stack1.top();stack1.pop();
return res=='1';
}
bool dfs(int ix, string &s) {
if (ix == vector1.size()) {
//说明到了一种情况
// cout << s << endl;
//计算这种情况是否可以
if (!computeExp(s))
throw "error";
return true;
}
//检查0是否满足
//检查1是否满足
//将ss中的ss[ix]替换为0;
pos = ix;
string temp = s;
replace_if(temp.begin(), temp.end(), cmp, '0');
dfs(ix + 1, temp);
//将ss中的ss[ix]替换为1;
temp = s;
pos = ix;
replace_if(temp.begin(), temp.end(), cmp, '1');
dfs(ix + 1, temp);
return true;
}
int main() {
// freopen("../in.txt", "r", stdin);
while (cin >> ss && ss != "0") {
//首先统计变量的个数
set<char> set1;
for (int i = 0; i < ss.size(); ++i) {
if (islower(ss[i]))
set1.insert(ss[i]);
}
set<char>::iterator it = set1.begin();
for (; it != set1.end(); it++)
vector1.push_back(*it);
//遍历每一种情况
//就是让其中的每个元素有两个状态,然后去检验
//现在的问题是循环的层数不能确定,dfs是一个有力的工具
try {
dfs(0, ss);
cout << "tautology" << endl;
} catch (...) {
cout << "not" << endl;
}
vector1.clear();
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交