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

解法不唯一,但是还是set好理解而且用着爽,代码注释应该够详细了

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
#include<iostream>
#include<ctype.h>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
using namespace std;
set<string>s1;
set<string>s2;
set<string>::iterator tt;
char ss[205];
char str[505][110];
int cc(char cs)//只检查字母数字,也就是存化学式,碰见+或者=就跳过去
{
    if(isdigit(cs))
        return 1;
    if(isalpha(cs))
        return 1;
    return 0;
}
int main()
{
    int t,i,j,n,m,fla,k;

    while(~scanf("%d",&n))
    {   s1.clear();
        s2.clear();

        for(i=0;i<n;i++)
            scanf("%s",str[i]);
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            scanf("%s",ss);
            s1.insert(ss);
        }
        for(i=0;i<n;i++)
        {
            fla=0;//,每一次也就是每个化学方程式都是从左开始,判断是=号左侧还是右侧的,右侧生成物也得存入反应物里,也就是s1集合里边,左侧的话直接检测给的能用的反应物以及生成物集合s1里有没有就行了
            for(j=0;j<strlen(str[i]);j++)
            {
                if(fla)//右侧生成物
                {
                    k=0;
                    memset(ss,'\0',sizeof(ss));
                    while(cc(str[i][j]))
                    {
                        ss[k++]=str[i][j];
                        j++;
                    }
                    if(s1.find(ss)==s1.end())//s1里没有的话表示是新生成物,存到s2,同时存到s1也可以利用
                        s2.insert(ss);
                    s1.insert(ss);
                }
                else  //左侧反应物
                {
                    k=0;
                    memset(ss,'\0',sizeof(ss));
                    while(cc(str[i][j]))
                    {
                        ss[k++]=str[i][j];
                        j++;
                    }
                    if(s1.find(ss)==s1.end()) break;//检查左侧,s1里不包含这个化学式表示并没有这个反应物,也就是没有这个化学方程式,直接跳过这个化学方程式就行。
                }
                if(str[i][j]=='=') fla=1;//找到=就标记,开始循环判断右侧生成物
            }
        }
        cout<<s2.size()<<endl;
        for(tt=s2.begin();tt!=s2.end();tt++)
            cout<<*tt<<endl;
    }
}

 

posted @ 2018-05-22 09:26  NoRain丶  阅读(118)  评论(0编辑  收藏  举报