1. 程式人生 > >NYOJ 542 試制品(第五屆河南省省賽)

NYOJ 542 試制品(第五屆河南省省賽)

ret 找到 stream 同時 利用 CA tor for space

解法不唯一,但是還是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; } }

NYOJ 542 試制品(第五屆河南省省賽)