解法不唯一,但是还是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; } }
原文地址:https://www.cnblogs.com/nr1999/p/9070433.html
时间: 2024-10-27 10:02:17