队友写的、、太强了
#include<bits/stdc++.h>
using namespace std;
set<string>st1,st2,ans;
int last,j,len;
bool fun(string s)
{
len=s.length();
unordered_set<string>stt;//反应物
stt.clear();
last=0;
j=0;
for(j=0;j<len;j++)
{
if(s[j]=='+'||s[j]=='=')
{
stt.insert(s.substr(last,j-last));
//cout<<s[i].substr(last,j-last)<<endl;
last=j+1;
if(s[j]=='=')break;
}
}
for(auto x:stt)//判断
if(st1.count(x)==0)
return false;
return true;
}
int main()
{
int n,m;
while(cin>>n)
{
int vis[500];
memset(vis,0,sizeof vis);
st1.clear();
st2.clear();
ans.clear();
string s[410];
for(int i=0;i<n;i++)
cin>>s[i];
int m;
cin>>m;
string t;
for(int i=0;i<m;i++)//已有
{
cin>>t;
st1.insert(t);
st2.insert(t);
}
for(int i=0;i<n;i++)//
{
if(fun(s[i]))
{
vis[i]=1;
for(;j<len;j++)//生成物
{
if(s[i][j]=='+')
{
ans.insert(s[i].substr(last,j-last));
st1.insert(s[i].substr(last,j-last));
last=j+1;
}
}
ans.insert(s[i].substr(last,len-last));
st1.insert(s[i].substr(last,len-last));
for(int k=0;k<n;k++)//为的是判断 这次反应后 前面的方程式是否满足
{
if(vis[k]) continue;
if(fun(s[k]))
{
vis[k]=1;
for(;j<len;j++)//生成物
{
if(s[k][j]=='+')
{
ans.insert(s[k].substr(last,j-last));
st1.insert(s[k].substr(last,j-last));
//cout<<s[k].substr(last,j-last)<<endl;
last=j+1;
}
}
ans.insert(s[k].substr(last,len-last));
st1.insert(s[k].substr(last,len-last));
//cout<<s[k].substr(last,len-last)<<endl;
}
}
}
}
queue<string>q;
for(auto x:ans)
if(st2.count(x)==0) q.push(x);
cout<<q.size()<<endl;
while(q.size())
{
cout<<q.front()<<endl;
q.pop();
}
}
return 0;
}