河南省第五届ACM比赛【T3】
题目链接:NYOJ 题目542 试制品
关键字:字符串处理 模拟
源代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
vector<string> vt_rea[400];
vector<string> vt_res[400];
set<string> stsou;
set<string> stans;
void split(char *equation,int i) //分别提取化学式等号两边的化合物
{
int j,k,L;
char temp[11],c;
L=strlen(equation);
for( k=0,j=0;(c=equation[j++]) != '='; )
{
if(c == '+')
{
temp[k]='\0';
vt_rea[i].push_back(temp);
k=0;
}
else
temp[k++]=c;
}
temp[k]='\0';
vt_rea[i].push_back(temp);
for( k=0;(c=equation[j++]) != '\0'; )
{
if(c == '+')
{
temp[k]='\0';
vt_res[i].push_back(temp);
k=0;
}
else
temp[k++]=c;
}
temp[k]='\0';
vt_res[i].push_back(temp);
}
void Judge1(int i) //判断化学式的每个反应物是否在已有的化合物中
{
int j;
for(j=0;j<vt_rea[i].size();)
{
if( stsou.find( *(vt_rea[i].begin()+j) ) != stsou.end() )
vt_rea[i].erase(vt_rea[i].begin()+j); //若已存在则删除
else
j++;
}
}
void Judge2(int i) //判断化学式的每个反应物是否在新生成的化合物中
{
int j;
for(j=0;j<vt_rea[i].size();)
{
if( stans.find( *(vt_rea[i].begin()+j) ) != stans.end() )
vt_rea[i].erase(vt_rea[i].begin()+j); //若存在则删除
else
j++;
}
}
void insert(int i,int &flag) //将可以反应的化学式的生成物插入新生成的化合物集合
{
vector<string>::iterator it;
for(it=vt_res[i].begin();it!=vt_res[i].end();it++)
if(stsou.find(*it)==stsou.end())
{
stans.insert(*it);
flag=1;
}
}
int main()
{
int n,m,i,j,flag=0;
char equation[102],temp[11],c;
set<string>::iterator sit;
cin>>n;
for(i=0;i<n;i++)
{
cin>>equation;
split(equation,i);
}
cin>>m;
for(i=0;i<m;i++)
{
cin>>temp;
stsou.insert(temp);
}
for(i=0;i<n;i++)
{
if(!vt_rea[i].empty())
{
Judge1(i);
if(vt_rea[i].empty())
insert(i,flag);
}
}
while(flag)
{
flag=0;
for(i=0;i<n;i++)
{
if(!vt_rea[i].empty())
{
Judge2(i);
if(vt_rea[i].empty())
insert(i,flag);
}
}
}
cout<<stans.size()<<endl;
for(sit=stans.begin();sit!=stans.end();sit++)
cout<<*sit<<endl;
return 0;
}