Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9078 | Accepted: 3477 |
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:
- p, q, r, s, and t are WFFs
- if w is a WFF, Nw is a WFF
- if w and x are WFFs, Kwx, Awx, Cwx, and Ewx are WFFs.
- p, q, r, s, and t are logical variables that may take on the value 0 (false) or 1 (true).
- K, A, N, C, E mean and, or, not, implies, and equals as defined in the truth table below.
|
w x | Kwx | Awx | Nw | Cwx | Ewx |
1 1 | 1 | 1 | 0 | 1 | 1 |
1 0 | 0 | 1 | 0 | 0 | 0 |
0 1 | 0 | 1 | 1 | 1 | 0 |
0 0 | 0 | 0 | 1 | 1 | 1 |
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
解法:输入保证是合法WFF 串,分为2^5种情况枚举。从右向左模拟运算。
代码:
/******************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;
#define eps 1e-8
const double pi=acos(-1.0);
typedef long long LL;
const int Max=10100;
const int INF=1000000007;
char s[110];
bool tool[110];
int p=0;
int len=0;
bool OK(int k)
{
p=0;
for(int i=0; i<len; i++)
{
switch (s[i])
{
case 'p':
tool[p++]=(k&1);
break;
case 'q':
tool[p++]=(k&2);
break;
case 'r':
tool[p++]=(k&4);
break;
case 's':
tool[p++]=(k&8);
break;
case 't':
tool[p++]=(k&16);
break;
case 'N':
tool[p-1]=!tool[p-1];
break;
case 'K':
tool[p-2]=tool[p-1]&tool[p-2];
p--;
break;
case 'A':
tool[p-2]=tool[p-1]||tool[p-2];
p--;
break;
case 'C':
if(tool[p-1]==1&&tool[p-2]==0)
tool[p-2]=0;
else
tool[p-2]=1;
p--;
break;
case 'E':
tool[p-2]=!(tool[p-1]^tool[p-2]);
p--;
break;
}
}
return tool[0];
}
int main()
{
while(scanf("%s",s)==1)
{
len=strlen(s);
reverse(s,s+len);
if(s[0]=='0')
break;
bool b=1;
for(int i=0; i<(1<<5); i++)
{
if(!OK(i))
{
b=0;
break;
}
}
if(b)
printf("tautology\n");
else
printf("not\n");
}
return 0;
}