Problem
Description
Input
Output
Sample Input
((F(TF))(TF))
(TFT)
((TFT)T)
Sample Output
1. false
2. false
3. true
Data Constraint
Solution
直接纯模拟,设置一个栈,维护本层节点的真假值。
注意输出,一定要输出数字,逗号,空格,以及答案。
听说有大神因为没打空格整题爆0。
说一下我拿30分的原因,我无聊多维护了一个变量,其实就是栈层的奇偶性。结果运行运行着多余的那个变量发生变动。
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define N 32010
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
char s[N];
int i,j,L,gs,ans,x,z,last,a[N][2],p;
int main()
{
freopen("form.in","r",stdin);
freopen("form.out","w",stdout);
while (scanf("%s",s+1)!=EOF)
{
L=strlen(s+1);
z=0;
x=last=-1;
a[0][1]=-1;
fo(i,1,L)
{
if (s[i]=='(')
{
x=-x;
a[++z][0]=x;
a[z][1]=-1;
} else
if (s[i]==')')
{
last=a[z][1];
a[z][0]=a[z][1]=0;
z--;
if (z%2)
{
if (a[z][1]==-1) a[z][1]=last;else
a[z][1]=a[z][1]&last;
} else
{
if (a[z][1]==-1) a[z][1]=last;else
a[z][1]=a[z][1]|last;
}
} else
{
p=(s[i]=='T');
if (z%2)
{
if (a[z][1]==-1) a[z][1]=p;else
a[z][1]=a[z][1]&p;
} else
{
if (a[z][1]==-1) a[z][1]=p;else
a[z][1]=a[z][1]|p;
}
}
}
gs++;
printf("%d. ",gs);
if (!a[z][1]) printf("false\n");else printf("true\n");
}
}