关于我把 看成了 一事

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define debug() puts("I WILL AK")
#define N 1000007
#define M 900
int v_a[M],v_b[M],v_c[M];

string mul(string a,string b){
	if(a=="0"||b=="0") return "0";
	int la=a.size(),lb=b.size();
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	memset(v_a,0,sizeof(v_a));
	memset(v_b,0,sizeof(v_b));
	memset(v_c,0,sizeof(v_c));
	for(int i=0;i<la;++i) v_a[i]=a[i]-'0';
	for(int i=0;i<lb;++i) v_b[i]=b[i]-'0';
	for(int i=0;i<la;++i){
		for(int j=0;j<lb;++j){
			v_c[i+j]+=v_a[i]*v_b[j];
		}
	}
	int i;
	for(i=0;i<la+lb;++i) v_c[i+1]+=v_c[i]/10,v_c[i]%=10;
	while(1){
		v_c[i+1]+=v_c[i]/10;
		v_c[i]%=10;
		if(v_c[++i]==0) break;
	}
	reverse(v_c,v_c+la+lb+1);
	int h=0;
	string as;
	for(int j=0;j<i;++j){
		if(!h&&v_c[j]==0) continue;
		else{
			as.push_back(v_c[j]+'0');
			h=1;
		}
	}
	return as==""?"0":as;
}
string add(string a,string b){
	int la=a.size(),lb=b.size();
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	memset(v_a,0,sizeof(v_a));
	memset(v_b,0,sizeof(v_b));
	memset(v_c,0,sizeof(v_c));
	for(int i=0;i<la;++i) v_a[i]=a[i]-'0';
	for(int i=0;i<lb;++i) v_b[i]=b[i]-'0';
	for(int i=0;i<=max(la,lb);++i) v_c[i]=v_a[i]+v_b[i];
	for(int i=0;i<=max(la,lb);++i){
		if(v_c[i]>=10){
			v_c[i]-=10;
			v_c[i+1]++;
		}
	}
	reverse(v_c,v_c+max(la,lb)+1);
	int h=0;
	string as;
	for(int j=0;j<=max(la,lb);++j){
		if(!h&&v_c[j]==0) continue;
		else{
			as.push_back(v_c[j]+'0');
			h=1;
		}
	}
	return as==""?"0":as;
}
unordered_map<string,string> unp;
int n;
string say;
string bl;
string ss[N];
int stars[N];
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;++i){
		string z;
		cin>>ss[i]>>z;
		unp[ss[i]]=z;
	}
	getchar();
	string lst="";
	string sss;
	getline(cin,sss);
	int ctx=0;
	int szsss=sss.size();
	for(int i=0;i<szsss;++i){
		if(sss[i]=='$') stars[++ctx]=i;
	}
	for(int i=1;i<=ctx;i+=2){
		bl=sss.substr(stars[i]+1,stars[i+1]-stars[i]-1);
		bl=bl+"*"+bl;
		//cout<<bl<<'\n';
		int l=bl.size();
		string cnt="";//变量名字
		string as="0";//结果
		string cj="1";//乘积
		bool h=0;
		bool isd=0;
		char lst='!';
		for(int j=0;j<l;++j){
			if(bl[j]=='+'){
				//cout<<cnt<<'\n';
				lst='+';
				isd=1;
				cj=mul(cj,unp[cnt]);
				as=add(as,cj);
				cj="1";
				cnt="";
				h=0;
			}
			else if(bl[j]=='*'){
				//cout<<cnt<<'\n';
				lst='*';
				isd=1;
				h=1;
				cj=mul(cj,unp[cnt]);
				cnt="";
			}
			else{
				cnt.push_back(bl[j]);
			}
			//cout<<"cj:"<<cj<<'\n';
		}
		if(lst=='*'){
			cj=mul(cj,unp[cnt]);
			as=add(as,cj);
		}
		else if(lst=='+'){
			as=add(as,unp[cnt]);
		}
		cout<<as<<'\n';
	}
	return 0;
}