记录编号 160176 评测结果 AAAAAAAAAA
题目名称 物质起源 最终得分 100
用户昵称 GravatarDijkstra 是否通过 通过
代码语言 C++ 运行时间 0.248 s
提交时间 2015-04-24 14:10:10 内存使用 0.42 MiB
显示代码纯文本
#include<fstream>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<map>
#define MAXN 401
#define MAXM 501
#define MAXP (401*40+500)
#define MAXQ 21
using namespace std;
ifstream fin("origin.in");
ofstream fout("origin.out");
int N,M,L=0,n_in[MAXN],n_out[MAXN],ans_L=0;
string eq[MAXN],in[MAXN][MAXQ],out[MAXN][MAXQ],ans[MAXP];
bool F[MAXP],old[MAXP];
map<string,int>m;
bool cmp(string a,string b){return a<b;}
void make_eq(int q)
{
	bool flag=0;
	string x=eq[q];
	int l=x.length();
	string S="";
	for(int i=0;i<=l;i++)
	{
		if(i==l||x[i]=='+'||x[i]=='=')
		{
			if(!flag) in[q][++n_in[q]]=S;
			else out[q][++n_out[q]]=S;
			if(x[i]=='=') flag=1;
			if(m.count(S)){S="";continue;}
			m[S]=++L;
			S="";
		}
		else S+=x[i];
	}
}
void INPUT()
{
	memset(F,0,sizeof(F));
	memset(old,0,sizeof(old));
	memset(n_in,0,sizeof(n_in));
	memset(n_out,0,sizeof(n_out));
	fin>>N;
	for(int i=1;i<=N;i++)
	{
		fin>>eq[i];
		make_eq(i);
	}
	string st;
	fin>>M;
	for(int i=1;i<=M;i++)
	{
		fin>>st;
		if(!m.count(st)) continue;
		F[m[st]]=1;
		old[m[st]]=1;
		ans[ans_L++]=st;
	}
}
void WORK()
{
	for(int k=1;k<=N;k++)
	{
		for(int i=1;i<=N;i++)
		{
			bool flag=1;
			for(int j=1;j<=n_in[i];j++) flag&=F[m[in[i][j]]];
			if(!flag) continue;
			for(int j=1;j<=n_out[i];j++) 
			{
				if(!F[m[out[i][j]]]) ans[ans_L++]=out[i][j];
				F[m[out[i][j]]]=1;
			}
		}
	}
}
void OUTPUT()
{
	sort(ans,ans+ans_L,cmp);
	M=0;
	for(int i=0;i<ans_L;i++) if(!old[m[ans[i]]]) M++;
	fout<<M<<endl;
	for(int i=0;i<ans_L;i++) if(!old[m[ans[i]]]) fout<<ans[i]<<endl;
}
int main()
{
	INPUT();
	WORK();
	OUTPUT();
	return 0;
}