Poj 3295

用的枚举的办法。列表上写的是构造法。

WA了很长时间。开始的时候发现了一些没有赋初值的情况(继承了上次的值),后来不知道怎么回事了。结果是因为一个数组,p[i],i是ASCii码,结果我的范围写的i是100,导致了奇怪的错误。为何没有溢出CE?

// #includes {{{

// #includes {{{
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<assert.h>
    #include<stdarg.h>
    #include<time.h>
    #include<limits.h>
    #include<ctype.h>
    #include<string>
    #include<map>
    #include<set>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #include<iostream>
    #include<sstream>
    using namespace std;
    // }}}
    // #defines {{{
    #define FOR(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
    #define SZ(x) ((int)(x).size())
    #define ALL(x) (x).begin(),(x).end()
    #define REP(i,n) for(int i=0;i<(n);i++)
    #define REP1(i,a,b) for(int i=(a);i<=(b);i++)
    #define PER(i,n) for(int i=(n)-1;i>=0;i--)
    #define PER1(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(x) scanf("%d",&x)
    #define DRI(x) int x;RI(x)
    #define RII(x,y) scanf("%d%d",&x,&y)
    #define DRII(x,y) int x,y;RII(x,y)
    #define RIII(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define DRIII(x,y,z) int x,y,z;RIII(x,y,z)
    #define RS(x) scanf("%s",x)
    #define PI(x) printf("%d\n",x)
    #define PIS(x) printf("%d ",x)
    #define CASET int ___T,cas=1;scanf("%d",&___T);while(___T--)
    #define CASEN0(n) int cas=1;while(scanf("%d",&n)!=EOF&&n)
    #define CASEN(n) int cas=1;while(scanf("%d",&n)!=EOF)
    #define MP make_pair
    #define PB push_back

    #define MS0(x) memset(x,0,sizeof(x))
    #define MS1(x) memset(x,-1,sizeof(x))

    #define F first
    #define S second
    typedef pair<int,int> PII;
    typedef long long LL;
    typedef unsigned long long ULL;
    // }}}
string s;
int a=0;
bool f[300];
int p[300];
int now=0;
int last=0;
int check(int po){
     last=po;
    if (s[po]>97){
        return ((a>>p[s[po]])& 1);
    }
    if (s[po]==‘K‘){
        int w=check(po+1);
        int x=check(last+1);
        return (w && x);
    }
    if (s[po]==‘A‘){
        int w=check(po+1);
        int x=check(last+1);
        return( w || x);
    }
    if (s[po]==‘C‘){
        int w=check(po+1);
        int x=check(last+1);
        if (x==0 && w==1) return 0;
        else return 1;
    }
    if (s[po]==‘E‘){
        int w=check(po+1);
        int x=check(last+1);
        if ((x+w)==2 || (x+w)==0) return 1;
        else return 0;
    }
    if (s[po]==‘N‘){
        int w=check(po+1);
        return (!w);
    }

}
main(){
    cin>>s;
    while (s!="0"){
        string ans="tautology";
        for(int i=0;i<300;i++) {p[i]=0;f[i]=false;}
        now=0;
        for(int i=0;i<s.length();i++){
            if ((s[i]>97) && (!f[s[i]])){
                f[s[i]]=true;
                p[s[i]]=now++;
            }
        }
        a=0;
        while (a<(1<<5)){
        //    cout<<a<<endl;
            last=0;
            if (check(0)==0){
                ans="not";
                break;
            }
            a++;
        }
        cout<<ans<<endl;

        cin>>s;
    }
}

可以看到有一个,last=po。这是图了个省事,其实用一个变量就行了,开始思考的时候没想到位。

这是第一篇,坚持希望

时间: 2024-10-23 09:44:33

Poj 3295的相关文章

[ACM] POJ 3295 Tautology (构造)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9302   Accepted: 3549 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,

[ACM] POJ 3295 Ubiquitous Religions (并查集)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23093   Accepted: 11379 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

poj 3295 Tautology 伪递归

题目链接: http://poj.org/problem?id=3295 题目描述: 给一个字符串,字符串所表示的表达式中p, q, r, s, t表示变量,取值可以为1或0.K, A, N, C, E 分别表示且,或,非,真蕴含,等值.问表达式是不是永真的,如果是输出“tautology”,否则输出“not”. 解题思路: 这里借用到了递归的本质,也就是对栈的模拟,用递归进行压栈,求表达式的值,再加上对变量状态压缩进行枚举. 1 #include <cstdio>//本代码用G++交就ac,

POJ 3295 Tautology (栈模拟)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10096   Accepted: 3847 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

POJ 3295 Tautology(构造法)

题目网址:http://poj.org/problem?id=3295 题目: Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13231   Accepted: 5050 Description WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of the po

POJ - 3295 - Tautology = 枚举 + 二叉树遍历

http://poj.org/problem?id=3295 题意:给若干个小写字母表示bool变量,大写字母表示bool运算,求这个表达式的是否为永真表达式. 输入形如: ApNp ApNq 也就是前缀表达式. 所以就写个东西遍历它构造一棵树,然后给同名变量枚举赋值,假如没有任何赋值使得树根输出0,则为永真表达式. 考察二叉树的递归遍历. #include<algorithm> #include<cmath> #include<cstdio> #include<

poj 3295 Tautology [ 栈 ]

传送门 Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10107   Accepted: 3850 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,

poj 3295 Tautology

这题属于构造题,有两点需要想到: 1.所谓永真式就是说题设中所给的五个逻辑变量无论如何取值,最终的运算结果总是为真,这里就需要枚举五个逻辑变量的取值情形.很容易想到共有32种情况: 也就是说,对于每个字符串,如果这32种情况下的运算结果都是真的话, 那它就是永真式.1~32, 用按位与的办法,可以逐次枚举这32中情况. 2.运算顺序:可以这样理解题目中的字符串结构,它就像一颗树,所以叶子节点做逻辑运算之后逐次汇聚到根节点得到最后的结果.于是想到从尾部开始(也就是从叶节点向上). 如果遇到逻辑变量

POJ - 3295 - Tautology (构造)

题目传送:Tautology 思路:枚举所有变量可能的值(0或1),算出其表达式的值,因为题目是要求是否是永真式,求式子的真值可以用栈来求,栈的话,可以自己构造一个栈,也可以用STL的stack AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #in