dp[i] 表示状态i最多能合成前dp[i]所需要的元素
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,k,s1,s2;
string s[100]={"H","He","Li","Be","B",
"C","N","O","F","Ne",
"Na","Mg","Al","Si","P",
"S","Cl","Ar","K","Ca",
"Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr",
"Rb","Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn","Sb","Te","I","Xe","Cs","Ba","La",
"Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl",
"Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm"};
string t;
int a[100],b[100],g[100][100];
int dp1[200000],dp2[200000],father[200000];
bool ok;
void read(int &x){
cin>>t;
for (int i=0;i<=99;i++)
if (s[i]==t){
x=i+1;
return;
}
}
void check(){
for (int i=1;i<=(1<<n)-1;i++)
for (int j=1;j<=n;j++)
if (i&(1<<(j-1)))
dp1[i]+=a[j];
for (int i=1;i<=(1<<n)-1;i++){
dp2[i]=-1;
for (int j=i;j;j=(j-1)&i){
if (dp2[i^j]!=-1 && b[dp2[i^j]+1]==dp1[j]){
dp2[i]=dp2[i^j]+1;
father[i]=i^j;
}
}
}
if (dp2[(1<<n)-1]==k) {
ok=1;
int x=(1<<n)-1;
for (int i=k;i>=1;i--){
for (int j=1;j<=n;j++)
if ((1<<(j-1))&(x^father[x]))
g[i][++g[i][0]]=j;
x=father[x];
}
}
}
int main(){
cin>>n>>k;
for (int i=1;i<=n;i++) {read(a[i]);s1+=a[i];}
for (int i=1;i<=k;i++) {read(b[i]);s2+=b[i];}
if (s1==s2) check();
if (!ok) cout<<"NO\n";
else {
cout<<"YES\n";
for (int i=1;i<=k;i++){
cout<<s[a[g[i][1]]-1];
for (int j=2;j<=g[i][0];j++)
cout<<"+"<<s[a[g[i][j]]-1];
cout<<"->"<<s[b[i]-1]<<"\n";
}
}
return 0;
}