记录编号 106858 评测结果 R
题目名称 1407.[SHOI 2015]Discover Water Tank 最终得分 0
用户昵称 cstdio 是否通过 未通过
代码语言 C++ 运行时间 0.000 s
提交时间 2014-06-20 11:09:15 内存使用 0.33 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<vector>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int SIZE=2010;
string Std_in,Std_out,Student_out;
int K;
set<string> choo;
int N,F;
map<string,bool> mates;
char s[SIZE]={0};
int matchbk[SIZE]={0};
void prepare(void){
	//string s1="\0";
	int tot=0;
	int len=strlen(s);
	for(int i=0;i<len;i++){
		if(s[i]!=' '&&s[i]!='\n'&&s[i]!='\r'){
			s[tot++]=s[i];
			//s1+=s[i];
		}
	}
	//s=s1;
	s[tot]=0;
	vector<int> st;
	for(int i=0;i<tot;i++){
		if(s[i]=='(') st.push_back(i);
		if(s[i]==')'){
			matchbk[i]=st.back();
			st.pop_back();
		}
	}
}
bool calc(int l,int r){
	//for(int i=l;i<=r;i++) cout<<s[i];cout<<endl;
	while(s[r]==')'&&matchbk[r]==l) l++,r--;
	for(int i=r;i>=l;i--){
		if(s[i]==')') i=matchbk[i];
		if(s[i]=='&'){
			return calc(l,i-1)&&calc(i+1,r);
		}
		else if(s[i]=='|'){
			return calc(l,i-1)||calc(i+1,r);
		}
		else if(s[i]=='>'){
			return !(calc(l,i-2)&&(!calc(i+1,r)));
		}
	}
	string str="\0";
	for(int i=l;i<=r;i++){
		if(s[i]!='-') str+=s[i];
	}
	bool ans=mates[str];
	if(s[l]=='-') ans^=1;
	return ans;
}
void markname(void){
	//freopen(Std_in.c_str(),"r",stdin);
	cin>>N;
	string str;
	for(int i=1;i<=N;i++){
		cin>>str;
		mates[str]=choo.count(str);
	}
}
void readans(void){
	//freopen(Student_out.c_str(),"r",stdin);
	cin>>K;
	string str;
	for(int i=1;i<=K;i++){
		cin>>str;
		choo.insert(str);
	}
}
void readline(char s[]){
	int tot=0;
	char ch;
	do{
		if(scanf("%c",&ch)==EOF) break;
		s[tot++]=ch;
	}while(ch!='\n'&&ch!='\r');
	s[tot]=0;
}
int judge(void){
	readans();
	markname();
	cin>>F;
	getchar();
	for(int i=1;i<=F;i++){
		memset(s,0,sizeof(s));
		//cin.getline(s,SIZE-1);
		readline(s);
		//cout<<strlen(s)<<endl;
		prepare();
		//getchar();
		//getline(cin,s);
		//cin>>s;
		//cout<<s<<endl;
		if(!calc(0,strlen(s)-1)) return 0;
	}
	return 100;
}
int main(){
	freopen("teyf.in","r",stdin);
	Std_in="teyf.in";
	//Std_out="rng1.ans";
	Student_out="teyf.out";
	freopen("teyf.out","w",stdout);
	cout<<judge()<<endl;
	return 0;
	//return judge();
}
/*int main(int argc,char* argv[]){
	Std_in=string(argv[1]);
	Std_out=string(argv[3]);
	Student_out=string(argv[2]);
	return judge();
}*/