哈哈,这个题目比较有意思。
一开始丝毫没有头绪,后来我想用分治的想法行不行呢,切割,然后函数返回该段的结果和结束位置,还很惆怅怎么存储的问题,然后我去洗头寻思出去溜达溜达,突然想起来我可以用结构体返回啊,这样就很简洁了,哈哈,这样什么都有了思路也很清晰,函数代码还真的不长,哈哈。
后来一个劲的RE,才发现有1个元素的情况,再交,这回是WA了!通过检查这是因为我讨论N的时候忘记了一种情况。。。
不过这题写出来还是很有成就感的。
××××××××××××××××××××××××××××××××××××××××××××××××
总体思路就是 分治 + 递归
p,q,r,s,t的值需要在iff中通过遍历来初始化。然后调用haha()
struct res haha( int begin ) // tmp[begin] ------> 5种操作的一种
函数的功能是返回一种操作的结果和该操作影响的位置。我在代码里面写的已经很明晰了。
在求得该操作对象的值时候有两种情况,一种是该值是p,q,r,s,t中的一个,另一种是该值是5种操作得出的结果,这种情况就要递归调用haha。
代码还是比较清晰的!
××××××××××××××××××××××××××××××××××××××××××××××××
1 #include <stdio.h> 2 #include <string.h> 3 char tmp[1000000+10]; 4 int p,q,r,s,t; 5 int l; 6 struct res{ 7 int pos; 8 int res; 9 }; 10 struct res haha(int begin){ 11 char SIGN=tmp[begin]; 12 struct res rr; 13 int a,b; /* 操作的值 */ 14 int pos; 15 struct res tt; 16 if(SIGN=='N'){ 17 pos=begin+1; 18 /* 19 * 找N操作的a值 20 * 21 * 其他操作寻值跟这个一样 22 * 23 * 24 */ 25 /* 情况 1 */ 26 if(tmp[pos]=='0'||tmp[pos]=='1'){ 27 a=tmp[pos]-'0'; 28 pos=pos; 29 }else{ 30 /* 情况 2 */ 31 tt=haha(pos); 32 a=tt.res; 33 pos=tt.pos; 34 } 35 if(a==0) rr.res=1; 36 else rr.res=0; 37 rr.pos=pos; 38 return rr; 39 } 40 else{ 41 /* 42 * 这里寻值跟上面不同的是,这个要寻找两个值,a,b 43 * 44 * 第一次寻找a,然后用得到的信息开始寻找b 45 * 46 * 思路是一样的 47 * 48 */ 49 pos=begin+1; 50 if(tmp[pos]=='0'||tmp[pos]=='1'){ 51 a=tmp[pos]-'0'; 52 pos=pos+1; 53 }else{ 54 tt=haha(pos); 55 a=tt.res; 56 pos=tt.pos+1; 57 } 58 if(tmp[pos]=='0'||tmp[pos]=='1'){ 59 b=tmp[pos]-'0'; 60 }else{ 61 tt=haha(pos); 62 b=tt.res; 63 pos=tt.pos; 64 } 65 } 66 rr.pos=pos; 67 68 if(SIGN=='K'){ 69 if(a*b>0) 70 rr.res=1; 71 else rr.res=0; 72 }else if(SIGN=='A'){ 73 if(a+b>0) rr.res=1; 74 else rr.res=0; 75 }else if(SIGN=='C'){ 76 if(a<=b) rr.res=1; 77 else rr.res=0; 78 }else if(SIGN=='E'){ 79 if(a==b) rr.res=1; 80 else rr.res=0; 81 } 82 return rr; 83 84 } 85 86 int iff(char str[]){ 87 l=strlen(str); 88 int i; 89 struct res sum; 90 for(p=0;p<=1;++p) 91 for(q=0;q<=1;++q) 92 for(r=0;r<=1;++r) 93 for(s=0;s<=1;++s) 94 for(t=0;t<=1;++t){ 95 strcpy(tmp,str); 96 for(i=0;i<l;++i){ 97 if(tmp[i]=='p') tmp[i]='0'+p; 98 else if(tmp[i]=='q') tmp[i]='0'+q; 99 else if(tmp[i]=='r') tmp[i]='0'+r; 100 else if(tmp[i]=='s') tmp[i]='0'+s; 101 else if(tmp[i]=='t') tmp[i]='0'+t; 102 } 103 sum=haha(0); 104 if(sum.res==0) return 0; 105 } 106 return 1; 107 } 108 int main(){ 109 char str[1000000+10]; 110 int rres; 111 while(~scanf("%s",str)){ 112 if(str[0]=='0') break; 113 if(strlen(str)==1){ printf("not\n");continue;} 114 rres=iff(str); 115 if(rres==1) printf("tautology\n"); 116 else printf("not\n"); 117 } 118 return 0; 119 }