第五届河南省程序设计大赛 C 试 制 品

队友写的、、太强了

#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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值