用的枚举的办法。列表上写的是构造法。
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