关于我把 看成了 一事
代码:
#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;
}