第五届河南省程序设计大赛 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;
}

猜你喜欢

转载自blog.csdn.net/wzazzy/article/details/89739186