模拟

a 反应物集合 ; b 生成物集合; c 存在的化合物或单质集合; ans 新生成化合物集合

1、如果反应无均在已生成的化合物集合中,则完成反应,将合成物加入c集合

2、对每个方程式的反应物进行排序,方便加速查找

3、不停的搜索,直到没有新化合物生成。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define N 402

vector<string>a[N];//左式化合物集合
vector<string>b[N];//右式化合物集合
vector<string>c;//存在的化合物
set<string>ans;//新生成化合物
bool found[N];//标记化学式是否已经合成 

int main() {
    freopen("d:\\in.txt", "r", stdin);
    int n, m;
    while(cin>>n) {
        memset(found, false, sizeof(found));
        ; i<n; i++){
            a[i].clear();
            b[i].clear();
        }
        c.clear();
        ans.clear();
        string expr, str;
        ; i<n; i++) {
            cin>>expr;
            );
            expr[mid] = '+';
            expr += "+";
            int len = expr.size();
            ; j<mid+; j++){
                if(expr[j] != '+')
                    str.push_back(expr[j]);
                else{
                    a[i].push_back(str);
                    str.clear();
                }
            }
            ; j<len; j++){
                if(expr[j] != '+')
                    str.push_back(expr[j]);
                else{
                    b[i].push_back(str);
                    str.clear();
                }
            }
        }
        cin>>m;
        ; i<m; i++){
            cin>>expr;
            c.push_back(expr);
        }
        ; i<n; i++){//排序方便查找
            sort(a[i].begin(), a[i].end());
        }
        bool hasnext = true;
        while(hasnext){
            hasnext = false;
            ; k<n; k++){
                if(found[k]) continue;
                ];
                if(find(c.begin(), c.end(), first) != c.end()){//如果方程式的第一个元素存在
                    int size = a[k].size();
                    ;
                    for( ; i<size; i++){//在已经存在的化合物集合中查找化学式剩余的化合物
                        , c.end(), a[k][i]) == c.end())
                            break;
                    }
                    if(i == size) {//如果左式完全匹配
                        found[k] = true;
                        hasnext = true;
                        for(vector<string>::iterator it = b[k].begin(); it != b[k].end(); it++){
                            if(find(c.begin(), c.end(), *it) == c.end()) {
                                c.push_back(*it);
                                ans.insert(*it);
                            }
                        }
                    }
                }
            }
        }
        cout<<ans.size()<<endl;
        for(set<string>::iterator it = ans.begin(); it != ans.end(); it++)
            cout<<*it<<endl;
    }
    ;
}

试制品 (nyoj 542)的更多相关文章

  1. NYOJ 542 试制品(第五届河南省省赛)

    解法不唯一,但是还是set好理解而且用着爽,代码注释应该够详细了 #include<stdio.h> #include<string.h> #include<math.h ...

  2. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

  3. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  4. NYOJ 333

    http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin 欧拉函数 E(x)表示比x小的且与x互质的正整数的个数. ...

  5. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  6. nyoj 10 skiing 搜索+动归

    整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int ...

  7. 简答哈希实现 (nyoj 138 找球号2)

    例题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=138 代码目的:复习哈希用 代码实现: #include "stdio.h&qu ...

  8. nyoj 284 坦克大战 简单搜索

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...

  9. nyoj 170 网络的可靠性

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=170 思路:统计每个节点的度,将度为1的节点消去所需要的最少的边即为答案. 代码: #in ...

随机推荐

  1. 为什么使用Ninject?

    Ninject 3 学习笔记 一.为什么使用Ninject? 分类: 程序2012-11-10 19:23 2209人阅读 评论(0) 收藏 举报 c#iocNinject框架注入 最近在使用IoC进 ...

  2. TeamCity vs Jenkins: Which is the Better Continuous Integration (CI) Server for .NET Software Development?

    原文:http://www.excella.com/insights/teamcity-vs-jenkins-better-continuous-integration-server So, you’ ...

  3. boost------signals2的使用1(Boost程序库完全开发指南)读书笔记

    signals2基于Boost的另一个库signals,实现了线程安全的观察者模式.在signals2库中,观察者模式被称为信号/插槽(signals and slots),他是一种函数回调机制,一个 ...

  4. iOS基础 - 控制器管理

    一.Container 一个iOS的app很少只由一个ViewController组成,除非这个app极其简单.当app中有多个ViewController的时候,我们就需要对这些ViewContro ...

  5. POJ 1002 UVA 755 487--3279 电话排序 简单但不容易的水题

    题意:给你许多串字符串,从中提取电话号码,输出出现复数次的电话号码及次数. 以下是我艰难的AC历程:(这题估计是我刷的题目题解次数排前的了...) 题目不是很难理解,刚开始想到用map,但stl的ma ...

  6. vijos1060 隔板法

    排列组合问题 之前没有学过隔板法,随便学习了一下 其实挺好理解的 附上题解: 先只考虑一种球:因为有n个盒子每个盒子可以放任意多球,还可以空出来任意多球.所以可以考虑为n+1个盒子,最后一个盒子里面是 ...

  7. D15

    T3: 树上的递归,很裸 T4:题目模型:二分染色问题 以及根据ccy大神指点,理解树形dp可以从 没有上司的舞会 聚会的快乐 这两题入手

  8. jQuery中的DOM操作《思维导图》

    首先,是关于jQuery中的DOM操作的<思维导图>,请点击这里:jQuery中的DOM操作 列表框的左右选项移动 <html> <head> <title& ...

  9. 如何本地测试例如QQ登录等第三方接口

    前言:现在基本是个网站就会集成第三方的一些接口,比如QQ登录.分享等等.但是在开发的时候,尤其是没有这方面经验的开发人员来说,调试流程时会显得迷茫,不知道怎么调试.这里就个人的这方面学习摸索做一个总结 ...

  10. C++内存中的封装、继承、多态(上)

    C++内存中的封装.继承.多态(上) 继我的上一篇文章:浅谈学习C++时用到的[封装继承多态]三个概念 此篇我们从C++对象内存布局和构造过程来具体分析C++中的封装.继承.多态. 一.封装模型的内存 ...