試 制 品
- 描述
-
ZZ大學的Dr.Kong最近發現實驗室的很多試製品都已經用完。由於項目經費有限,爲了節省,Dr.Kong決定利用實驗室現有的試製品來生成所缺的試製品。爲此,Dr.Kong連續幾天通宵達旦整理出一份研究資料並讓研究生Bill去實驗並統計能產生多少種所缺的試製品。
Bill從頭到尾翻完所有的資料,發現資料上寫滿了一大堆的化學方程式,上面除了大小寫英文字母、數字、加號、等號外,再也沒有其他的符號了。其中,每個方程式都是A1+A2+……+Ap=B1+B2+……+Bq的形式, 表示試製品A1,A2,……和Ap反應,生成了試製品B1,B2,……,Bq。其中Ai和Bj都是一種單質或化合物的化學式(長度不超過10個字符),1≤p,q ≤ 20 。每個方程式的總長不超過100個字符。有些試製品的化學式可能在現代社會的化學元素週期表裏找不到,這是由於化學反應過程中可能又有物理反應導致的結果。
Bill頭疼了,從哪個實驗開始呢?你能幫助他嗎?
- 輸入
- 有多組測試數據。
第一行:N表示Dr.Kong寫的化學方程式個數(1<=N<=400)
接下來有N行, 每一行是一個方程式.
再接下來的一行:M表示已有多少種試製品.(1<=M<=500)
接下來有M行,每一行是已有的一種試製品的化學式. - 輸出
- 第一行包含一個數T,表示可以產生多少種所缺的試製品.
在接下來的T行中,按ASCII碼升序輸出產生的試製品的化學式. - 樣例輸入
-
4H2O+Na=NaOH+H2Cl2+H2=HClFe+O2=Fe3O4NaOH+HCl=H2O+NaCl3H2ONa Cl2
- 樣例輸出
-
4H2HClNaClNaOH
-
#include <set> #include <cstdio> #include <cstring> #include <iostream> using namespace std; char ss[110]; char str[500][110]; set<string> s1; set<string> s2; set<string>::iterator it; int check(char ch){ if(ch>='a'&&ch<='z') return 1; if(ch>='A'&&ch<='Z') return 1; if(ch>='1'&&ch<='9') return 1; return 0; } int main(){ int i,j,k,t,n,m,len,flag; while(~scanf("%d",&n)){ s1.clear(); s2.clear(); for(i=0;i<n;i++) scanf("%s",str[i]); scanf("%d",&m); while(m--){ scanf("%s",ss); s1.insert(ss); } for(i=0;i<n;i++){ flag=0; len=strlen(str[i]); for(j=0;j<len;j++){ if(flag==1){ k=0; memset(ss,'\0',sizeof(ss)); while(check(str[i][j])){ ss[k++]=str[i][j]; j++; } //cout<<ss<<"222&&&"<<endl; if(s1.find(ss)==s1.end()) s2.insert(ss); s1.insert(ss); } else{ k=0; memset(ss,'\0',sizeof(ss)); while(check(str[i][j])){ ss[k++]=str[i][j]; j++; } if(s1.find(ss)==s1.end()) break; //cout<<ss<<"1111&&&"<<endl; } if(str[i][j]=='=') flag=1; } } cout<<s2.size()<<endl; for(it=s2.begin();it!=s2.end();it++) cout<<*it<<endl; } return 0; }