Tautology
Description WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of the possible symbols K, A, N, C, E, p, q, r, s, t. A Well-formed formula (WFF) is any string of these symbols obeying the following rules:
A tautology is a WFF that has value 1 (true) regardless of the values of its variables. For example, ApNp is a tautology because it is true regardless of the value of p. On the other hand, ApNq is not, because it has the value 0 for p=0, q=1. You must determine whether or not a WFF is a tautology. Input Input consists of several test cases. Each test case is a single line containing a WFF with no more than 100 symbols. A line containing 0 follows the last case. Output For each test case, output a line containing tautology or not as appropriate. Sample Input ApNp ApNq 0 Sample Output tautology not Source
Waterloo Local Contest, 2006.9.30
|
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <stack>
using namespace std;
int main()
{
char str[200];
int len,i,p,q,r,s,t,k;
int la1,la2;
while (~scanf("%s", str) && str[0] != '0')
{
len = strlen(str);
k=1;
for (p = 0; p < 2; p++)
for (q = 0; q < 2; q++)
for (r = 0; r < 2; r++)
for (s = 0; s < 2; s++)
for (t = 0; t < 2; t++)
{
stack<int>S;
for (i = len - 1; i >= 0; i--)
{
if (str[i] == 'p')
S.push(p);
if (str[i] == 'q')
S.push(q);
if (str[i] == 'r')
S.push(r);
if (str[i] == 's')
S.push(s);
if (str[i] == 't')
S.push(t);
if (str[i] == 'K')
{
la1 = S.top();
S.pop();
la2 = S.top();
S.pop();
S.push(la1 && la2);
}
if (str[i] == 'A')
{
la1 = S.top();
S.pop();
la2 = S.top();
S.pop();
S.push(la1 || la2);
}
if (str[i] == 'N')
{
la1 = S.top();
S.pop();
S.push(!la1);
}
if (str[i] == 'C')
{
la1 = S.top();
S.pop();
la2 = S.top();
S.pop();
S.push((!la1) || la2);
}
if (str[i] == 'E')
{
la1 = S.top();
S.pop();
la2 = S.top();
S.pop();
if (la1 == la2)
S.push(1);
else
S.push(0);
}
}
if (S.top() == 0)
k=0;
}
if(k==1)
printf("tautology\n");
else
printf("not\n");
}
return 0;
}