模拟

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. 个推推送 产品SDK常见问题检查

    作者:Hong Jack链接:https://zhuanlan.zhihu.com/p/20733333来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 通知和消息有什么 ...

  2. openGL剪裁区

    /** * 缓冲区工具类 */public class BufferUtil { /**  * 将浮点数组转换成字节缓冲区  */ public static ByteBuffer arr2ByteB ...

  3. JavaScript实例技巧精选(12)—计算星座与属相

    >>点击这里下载完整html源码<< 这是截图: 核心代码如下: <SCRIPT LANGUAGE="JavaScript"> <!-- ...

  4. ant svn

    <!-- 检出代码 这里使用 export 不是checkout 二者区别 checkout会svn相关信息文件检出,export只是检出最新的文件--> <target name= ...

  5. Windows服务、批处理项目实战

    一周一话题之三(Windows服务.批处理项目实战)   -->目录导航 一. Windows服务 1. windows service介绍 2. 使用步骤 3. 项目实例--数据上传下载服务 ...

  6. Winform系列

    小菜学习编程-Winform系列(初学者)   前言 记得上次写<小菜的程序员道路(二)>,这篇文章的时候说过,要把工作以来整理的编程知识分享给大家,因为这半年来的工作实在是忙,现在也在忙 ...

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

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

  8. 搭建一个完整的Java开发环境

    搭建一个完整的Java开发环境 作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,ecl ...

  9. JavaScript怎么上传图片

    JavaScript怎么上传图片 在XMLHttpRequest Level2出台之前,大多数的异步上传图片都是利用iframe去实现的. 至于具体的实现细节,我就不在这边啰嗦的,Google一下就有 ...

  10. WordPress 4.3.1正式发布 修复了3个安全问题

    WordPress 4.3.1正式发布  修复了3个安全问题! 出于安全性考虑,建议大家进行升级! WordPress 4.3.1 安全维护版本已经发布,该版本是针对之前所有版本的安全更新,强烈建议大 ...