首页 > 代码库 > Poj 3295

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。这是图了个省事,其实用一个变量就行了,开始思考的时候没想到位。

这是第一篇,坚持希望

Poj 3295