记录编号 |
160176 |
评测结果 |
AAAAAAAAAA |
题目名称 |
物质起源 |
最终得分 |
100 |
用户昵称 |
Dijkstra |
是否通过 |
通过 |
代码语言 |
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;
}