CYaRon!语
作者:互联网
CYaRon!语
开始之前
上次水了些小模拟之后感觉不能再颓废了,于是就来大模拟。
然后这个题花了我一个多星期
还是最差解
不过,为了纪念我的第 20 道紫题,纪念我这一周的努力,我还是想写篇题解,记录我的一点一滴。
大致思路
模拟题,都是根据题意直接模拟的(雾。
这个题呢,就适合分步完成。
关于变量
用的变量大都是汉语拼音或者缩写或者半缩写(比较好调)。
有些地方没加注释就可以直接读拼音理解含义。
成长过程
一 . 输出,变量,赋值
刚开始我是这么想的:
先把变量、数组和赋值、输出打完。
-
输出
直接将表达式的值计算出来输出即可。
-
变量和数组
用到了两个 map,用来映射 string 和 int 或者 array 之间的关系。
-
赋值
和输出差不多,将变量名储存下来,计算出后边表达式的值即可。
具体看代码(不保证正确)
const int inf=1e5+7;
char s[100];
string caozuo;
string bianl,leix,hang,val;
map<string,int>num;
struct shuzuay{
int from,to;
vector<int>h;
};
map<string,shuzuay>shuzu;
struct chuli{
int f;
string val;
}ls[1000];
int js(string _s)
{//计算表达式的值
int len=_s.size(),cnt=0;
for(int i=0;i<1000;i++)ls[i].val.clear();//清空
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
cnt++;
if(_s[i]=='+')ls[cnt].f=1;
if(_s[i]=='-')ls[cnt].f=-1;
continue;
}
ls[cnt].val+=_s[i];
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
int len=ls[i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
for(int j=0;j<len;j++)
{
if(ls[i].val[j]>='0'&&ls[i].val[j]<='9')
{ss=ss*10+ls[i].val[j]-48;continue;}
if(ls[i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
}
if(ss)ans+=ss;//数
else if(pd_shuzu)
{//数组
string xiabiao="";
for(int j=xiab;j<len;j++)
xiabiao+=ls[i].val[j];
xiabiao.erase(--xiabiao.end());
ans+=js(xiabiao);
}
else ans+=num[ls[i].val];//变量
}
return ans;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
if(s[0]=='{')
{
cin>>caozuo;
if(caozuo=="vars")
{
while(1)
{
getline(cin,hang);
if(hang=="}")break;
int len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]<=' ')continue;
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];//变量名
else leix+=hang[i];//类型
}
if(leix[0]=='i')num[bianl]=0;//变量
if(leix[0]=='a')
{//数组
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;//下标结束
if(js_to==0)shuzu[bianl].from=ls;//下标开始
if(js_to==-1)break;
js_to--;
}
}
for(int i=shuzu[bianl].from;i<=shuzu[bianl].to;i++)
shuzu[bianl].h.push_back(0);//好像并没有必要用 vector,但我当时就这么打的
}
}
}
if(caozuo=="ihu")
{
}
if(caozuo=="hor")
{
}
if(caozuo=="while")
{
}
}
if(s[0]==':')
{
caozuo.clear();
int len=strlen(s);
for(int i=1;i<len;i++)
caozuo+=s[i];
if(caozuo=="set")
{//赋值
cin>>bianl;//变量
bianl.erase(--bianl.end());
getline(cin,val);
int val_=js(val);//计算表达式
int len=bianl.size(),xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{//数组
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao);//计算下标
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;//数
}
if(caozuo=="yosoro")
{//输出
getline(cin,bianl);
wr(js(bianl));putchar(' ');
}
}
}
return 0;
}
显然这个 js
是不对的,没有判断减法,:yosoro 2-1
都是错的。
数组的处理也有些错误。
得了 20 分。
但我当时没在意,就去打 ihu
了。
二 .ihu
我对 ihu
想的很简单,没考虑循环的情况。
如果 ihu
合法,就顺序执行;否则,就将更深层数的读入,跳过。
层数的定义大概就是每遇到一个 {
层数 +1,遇到 }
层数 -1。
然后又小改了一下 js
,完善了减法的维护。
const int inf=1e5+7;
char s[100];
string caozuo;
string bianl,leix,input,hang,val,tiaoj,pd1,pd2;
int cengs;
map<string,int>num;
struct shuzuay{
int from,to;
vector<int>h;
};
map<string,shuzuay>shuzu;
struct chuli{
int f;
string val;
}ls[1000];
int js(string _s)
{
int len=_s.size();
int cnt=0;
for(int i=0;i<1000;i++)ls[i].val.clear();
bool fir=1;//对第一个数是负数的特判
ls[0].f=1;//默认正数
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
if(fir&&_s[i]=='-');
else cnt++;
if(_s[i]=='+')ls[cnt].f=1;
if(_s[i]=='-')ls[cnt].f=-1;
continue;
}
ls[cnt].val+=_s[i];
fir=0;
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
int len=ls[i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
for(int j=0;j<len;j++)
{
if(ls[i].val[j]>='0'&&ls[i].val[j]<='9')
{ss=ss*10+ls[i].val[j]-48;continue;}
if(ls[i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
}
if(ss)ans+=ss*ls[i].f;//数
else if(pd_shuzu)
{//数组
string xiabiao="";
for(int j=xiab;j<len;j++)
xiabiao+=ls[i].val[j];
xiabiao.erase(--xiabiao.end());
ans+=js(xiabiao);
}
else ans+=num[ls[i].val]*ls[i].f;//变量
}
return ans;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
if(s[0]=='}')cengs--;//统计层数
if(s[0]=='{')
{
cengs++;//统计层数
cin>>caozuo;
if(caozuo=="vars")
{
while(1)
{
getline(cin,input);
hang.clear();
int len=input.size();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='}'){cengs--;break;}
len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];
else leix+=hang[i];
}
if(leix[0]=='i')num[bianl]=0;
if(leix[0]=='a')
{
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;
if(js_to==0)shuzu[bianl].from=ls;
if(js_to==-1)break;
js_to--;
}
}
for(int i=shuzu[bianl].from;i<=shuzu[bianl].to;i++)
shuzu[bianl].h.push_back(0);
}
}
}
if(caozuo=="ihu")
{
cin>>tiaoj>>pd1>>pd2;//判断条件和两个表达式
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
int ls1=js(pd1),ls2=js(pd2);
bool pd_hf=0;//判断合法
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)
{//不合法就跳过
int now_cs=cengs--;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='{')now_cs++;
if(hang[0]=='}')now_cs--;
if(now_cs==cengs)break;
}
}
}
if(caozuo=="hor")
{
}
if(caozuo=="while")
{
}
}
if(s[0]==':')
{
caozuo.clear();
int len=strlen(s);
for(int i=1;i<len;i++)
caozuo+=s[i];
if(caozuo=="set")
{
cin>>bianl;
bianl.erase(--bianl.end());
getline(cin,val);
int val_=js(val);
int len=bianl.size(),xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao);
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;
}
if(caozuo=="yosoro")
{
getline(cin,bianl);
wr(js(bianl));putchar(' ');
}
}
}
return 0;
}
事实证明,我的 ihu
思路上没什么大错误。
30 分。
三 . 数组
之后我看了数据那张图。
就这个:
“不对啊,应该是 50 吗?”
然后就开始调试数组。
我就发现 js
用递归的话,ls
是个全局变量,会被清空。
然后我就直接当数字计算了……
没考虑数组下标是变量的情况。
不过,50 分就这么到手了……
const int inf=1e5+7;
char s[100];
string caozuo;
string bianl,leix,input,hang,val,tiaoj,pd1,pd2,sta_,end_;
int cengs;
map<string,int>num;
struct shuzuay{
int from,to;
vector<int>h;
};
map<string,shuzuay>shuzu;
struct chuli{
int f;
string val;
}ls[1000];
int js(string _s)
{
int len=_s.size();
int cnt=0;
for(int i=0;i<1000;i++)ls[i].val.clear();
bool fir=1;
ls[0].f=1;
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
if(fir&&_s[i]=='-');
else cnt++;
if(_s[i]=='+')ls[cnt].f=1;
if(_s[i]=='-')ls[cnt].f=-1;
continue;
}
ls[cnt].val+=_s[i];
fir=0;
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
len=ls[i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
string bianliang="";
for(int j=0;j<len;j++)
{
if(ls[i].val[j]>='0'&&ls[i].val[j]<='9')
{ss=ss*10+ls[i].val[j]-48;continue;}
if(ls[i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
bianliang+=ls[i].val[j];
}
if(ss)ans+=ss*ls[i].f;
else if(pd_shuzu)
{
string xiabiao="";
for(int j=xiab;j<len-1;j++)
xiabiao+=ls[i].val[j];
int xiab_=0;
len=xiabiao.size();
for(int j=0;j<len;j++)
xiab_=xiab_*10+xiabiao[j]-48;
ans+=shuzu[bianliang].h[xiab_-shuzu[bianliang].from]*ls[i].f;
}
else ans+=num[ls[i].val]*ls[i].f;
}
return ans;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
if(s[0]=='}')cengs--;
if(s[0]=='{')
{
cengs++;
cin>>caozuo;
if(caozuo=="vars")
{
while(1)
{
getline(cin,input);
hang.clear();
int len=input.size();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='}'){cengs--;break;}
len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];
else leix+=hang[i];
}
if(leix[0]=='i')num[bianl]=0;
if(leix[0]=='a')
{
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;
if(js_to==0)shuzu[bianl].from=ls;
if(js_to==-1)break;
js_to--;
}
}
for(int i=shuzu[bianl].from;i<=shuzu[bianl].to;i++)
shuzu[bianl].h.push_back(0);
}
}
}
if(caozuo=="ihu")
{
cin>>tiaoj>>pd1>>pd2;
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
int ls1=js(pd1),ls2=js(pd2);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)
{
int now_cs=cengs--;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='{')now_cs++;
if(hang[0]=='}')now_cs--;
if(now_cs==cengs)break;
}
}
}
if(caozuo=="hor")
{
}
if(caozuo=="while")
{
}
}
if(s[0]==':')
{
caozuo.clear();
int len=strlen(s);
for(int i=1;i<len;i++)
caozuo+=s[i];
if(caozuo=="set")
{
cin>>bianl;
bianl.erase(--bianl.end());
getline(cin,val);
int val_=js(val);
int len=bianl.size(),xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao);
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;
}
if(caozuo=="yosoro")
{
getline(cin,bianl);
wr(js(bianl));putchar(' ');
}
}
}
return 0;
}
四 .hor
从这开始,就开始有些恶心了。
因为要重复操作,顺序操作可能不好弄,所以这里选择了递归。
用了一个 zhixing
函数,将更深层数的操作储存下来。用循环递归处理。
但是因为是一些奇奇怪怪的原因,main
函数中的 zhixing
是以读入的形式执行的,而递归时则是以储存的形式执行的。
所以要有一些判断,将读入或是储存的代码统一起来。
const int inf=1e5+7;
char s[100];
string caozuo,more;
string bianl,leix,input,hang,val,tiaoj,pd1,pd2,xunh,sta_,end_;
int cengs;
map<string,int>num,last;
struct shuzu_{
int from,to;
vector<int>h;
};
map<string,shuzu_>shuzu;
struct chuli{
int f;
string val;
}ls[1000];
int js(string _s)
{
int len=_s.size();
int cnt=0;
for(int i=0;i<1000;i++)ls[i].val.clear();
bool fir=1;
ls[0].f=1;
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
if(fir&&_s[i]=='-');
else cnt++;
if(_s[i]=='+')ls[cnt].f=1;
if(_s[i]=='-')ls[cnt].f=-1;
continue;
}
ls[cnt].val+=_s[i];
fir=0;
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
len=ls[i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
string bianliang="";
for(int j=0;j<len;j++)
{
if(ls[i].val[j]>='0'&&ls[i].val[j]<='9')
{ss=ss*10+ls[i].val[j]-48;continue;}
if(ls[i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
bianliang+=ls[i].val[j];
}
if(ss)ans+=ss*ls[i].f;
else if(pd_shuzu)
{
string xiabiao="";
for(int j=xiab;j<len-1;j++)
xiabiao+=ls[i].val[j];
int xiab_=0;
len=xiabiao.size();
for(int j=0;j<len;j++)
xiab_=xiab_*10+xiabiao[j]-48;
ans+=shuzu[bianliang].h[xiab_-shuzu[bianliang].from]*ls[i].f;
}
else ans+=num[ls[i].val]*ls[i].f;
}
return ans;
}
void zhixing(string yuju)
{
if(yuju[0]=='}')cengs--;
if(yuju[0]=='{')
{
cengs++;
cin>>caozuo;
if(caozuo=="vars")
{
while(1)
{
getline(cin,input);
hang.clear();
int len=input.size();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='}'){cengs--;break;}
len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];
else leix+=hang[i];
}
if(leix[0]=='i')num[bianl]=0;
if(leix[0]=='a')
{
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;
if(js_to==0)shuzu[bianl].from=ls;
if(js_to==-1)break;
js_to--;
}
}
for(int i=shuzu[bianl].from;i<=shuzu[bianl].to;i++)
shuzu[bianl].h.push_back(0);
}
}
}
if(caozuo=="ihu")
{
cin>>tiaoj>>pd1>>pd2;
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
int ls1=js(pd1),ls2=js(pd2);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)
{
int now_cs=cengs--;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='{')now_cs++;
if(hang[0]=='}')now_cs--;
if(now_cs==cengs)break;
}
}
}
if(caozuo=="hor")
{
string chucun[1000]={};
int now_cs=cengs--,ccs=0;
cin>>xunh>>sta_>>end_;
xunh.erase(--xunh.end());
sta_.erase(--sta_.end());
int from=js(sta_),to=js(end_);
last[xunh]=num[xunh];
last[sta_]=num[sta_];
last[end_]=num[end_];
num[xunh]=from;
while(1)
{//储存层数更深的代码
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len)
{
if(input[ii]>' ')break;
ii++;
}
while(ii<len)hang+=input[ii],ii++;
chucun[++ccs]=hang;
if(hang[0]=='{')now_cs++;
if(hang[0]=='}')now_cs--;
if(now_cs==cengs)break;
}
for(int i=from;i<=to;i++)
{//递归执行
for(int j=1;j<=ccs;j++)
zhixing(chucun[j]);
num[xunh]++;
}
}
if(caozuo=="while")
{
}
}
if(yuju[0]==':')
{
caozuo.clear();more.clear();
int len=yuju.size();
int ii=1;
while(ii<len){if(yuju[ii]>' ')break;ii++;}
while(ii<len){if(yuju[ii]<=' ')break;caozuo+=yuju[ii];ii++;}
while(ii<len){more+=yuju[ii];ii++;}
if(caozuo=="set")
{
int len=more.size();
if(len==0)
{//读入代码
cin>>bianl;
getline(cin,val);
}
else
{//转化储存的代码
bianl.clear();val.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;bianl+=more[ii];ii++;}
while(ii<len){val+=more[ii];ii++;}
}
bianl.erase(--bianl.end());
int val_=js(val);
len=bianl.size();int xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao);
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;
}
if(caozuo=="yosoro")
{
int len=more.size();
if(len==0)getline(cin,bianl);
else bianl=more;
wr(js(bianl));putchar(' ');
}
}
}
int main()
{
while(scanf("%s",s)!=EOF)
zhixing(s);
return 0;
}
但这样只能执行单层循环,不能嵌套(不管是嵌套循环还是 ihu)。
而原因呢,就是因为如果循环之中嵌套循环,递归执行到下一次循环时,又会执行 getline
函数。
那么加一个判断条件,如果是第一次循环(严格来说是最外层循环),就将更深层次的存下来;否则就从之前储存的代码中找到要执行的语句。
const int inf=1e5+7;
char s[inf];
string caozuo,yuju,more,mtm;
string bianl,leix,input,hang,val,tiaoj,pd1,pd2;
map<string,int>num,last;
struct shuzu_{
int from,to;
vector<int>h;
};
map<string,shuzu_>shuzu;
struct chuli{
int f;
string val;
}ls[inf];
bool dycxh=1;
struct xunhuan{
string __s;
int cs,ccs;
}chucun[inf];
int ccs,duiy[inf];
int js(string _s)
{
int len=_s.size();
int cnt=0;
for(int i=0;i<1000;i++)ls[i].val.clear();
bool fir=1;
ls[0].f=1;
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
if(fir&&_s[i]=='-');
else cnt++;
if(_s[i]=='+')ls[cnt].f=1;
if(_s[i]=='-')ls[cnt].f=-1;
continue;
}
ls[cnt].val+=_s[i];
fir=0;
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
len=ls[i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
string bianliang="";
for(int j=0;j<len;j++)
{
if(ls[i].val[j]>='0'&&ls[i].val[j]<='9')
{ss=ss*10+ls[i].val[j]-48;continue;}
if(ls[i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
bianliang+=ls[i].val[j];
}
if(ss)ans+=ss*ls[i].f;
else if(pd_shuzu)
{
string xiabiao="";
for(int j=xiab;j<len-1;j++)
xiabiao+=ls[i].val[j];
int xiab_=0;
len=xiabiao.size();
for(int j=0;j<len;j++)
xiab_=xiab_*10+xiabiao[j]-48;
ans+=shuzu[bianliang].h[xiab_-shuzu[bianliang].from]*ls[i].f;
}
else ans+=num[ls[i].val]*ls[i].f;
}
return ans;
}
void zhixing(string benhang,int chucuns,int cengs)
{
int lenel=benhang.size(),ii=0;
if(lenel==0)return;
yuju.clear();more.clear();//对于储存或者输入的代码进行标准化处理,更容易区分。
while(ii<lenel){if(benhang[ii]>' ')break;ii++;}
while(ii<lenel){if(benhang[ii]<=' '){ii++;break;}yuju+=benhang[ii];ii++;}
while(ii<lenel)more+=benhang[ii],ii++;
if(yuju[0]=='}')cengs--;
else if(yuju[0]=='{')
{
cengs++;
int len=more.size();
if(len==0&&yuju.size())cin>>caozuo;//需要输入
else
{//转化储存
caozuo.clear();mtm.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]<=' '){ii++;break;}caozuo+=more[ii];ii++;}
while(ii<len){mtm+=more[ii];ii++;}
}
if(caozuo=="vars")
{
while(1)
{
getline(cin,input);
hang.clear();
int len=input.size();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='}'){cengs--;break;}
len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];
else leix+=hang[i];
}
if(leix[0]=='i')num[bianl]=0;
if(leix[0]=='a')
{
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;
if(js_to==0)shuzu[bianl].from=ls;
if(js_to==-1)break;
js_to--;
}
}
for(int i=shuzu[bianl].from;i<=shuzu[bianl].to;i++)
shuzu[bianl].h.push_back(0);
}
}
}
else if(caozuo=="ihu")
{
int len=mtm.size();
if(len==0)cin>>tiaoj>>pd1>>pd2;//需要读入
else
{//转化储存
tiaoj.clear();pd1.clear();pd2.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}tiaoj+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]>' '){ii++;break;}pd1+=mtm[ii];ii++;}
while(ii<len){pd2+=mtm[ii];ii++;}
}
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
int ls1=js(pd1),ls2=js(pd2);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)
{
int now_cs=cengs--;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='{')now_cs++;
if(hang[0]=='}')now_cs--;
if(now_cs==cengs)break;
}
}
}
else if(caozuo=="hor")
{
int now_cs=cengs--;
int len=mtm.size();
string xunh,sta_,end_;
if(len==0)cin>>xunh>>sta_>>end_;//需要读入
else
{//转化储存
xunh.clear();sta_.clear();end_.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}xunh+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}sta_+=mtm[ii];ii++;}
while(ii<len){end_+=mtm[ii];ii++;}
}
xunh.erase(--xunh.end());
sta_.erase(--sta_.end());
int from=js(sta_),to=js(end_);
last[xunh]=num[xunh];
last[sta_]=num[sta_];
last[end_]=num[end_];
num[xunh]=from;
int kais=0,jies=0;
if(dycxh==1)
{//第一次循环,读入储存
dycxh=0;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len){if(input[ii]>' ')break;ii++;}
while(ii<len)hang+=input[ii],ii++;
if(hang[0]=='{')now_cs++;
chucun[++ccs].__s=hang;
chucun[ccs].ccs=ccs;
chucun[ccs].cs=now_cs;
if(hang[0]=='}')now_cs--;
if(now_cs==cengs)break;
}
kais=1,jies=ccs;
}
else
{//从之前储存的代码中执行
kais=chucuns;int ls_cs=now_cs-1;
for(int qwq=kais+1;qwq<=ccs;qwq++)
{
if(chucun[qwq].__s[0]=='{')now_cs++;
if(chucun[qwq].__s[0]=='}')now_cs--;
if(now_cs==ls_cs){jies=qwq;duiy[kais-1]=qwq;break;}
}
}
for(int i=from;i<=to;i++)
{
for(int j=kais;j<=jies;j++)
{
zhixing(chucun[j].__s,chucun[j].ccs+1,chucun[j].cs);
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='h')
j=duiy[j];//用于跳过循环体
}
num[xunh]++;
}
num[xunh]=last[xunh];
num[sta_]=last[sta_];
num[end_]=last[end_];
}
else if(caozuo=="while")
{
}
}
else if(yuju[0]==':')
{
caozuo.clear();mtm.clear();
int ii=1;
yuju.erase(yuju.begin());
caozuo=yuju;
if(caozuo=="set")
{
int len=more.size();
if(len==0)
{
cin>>bianl;
getline(cin,val);
}
else
{
bianl.clear();val.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]<=' '){ii++;break;}bianl+=more[ii];ii++;}
while(ii<len){val+=more[ii];ii++;}
}
bianl.erase(--bianl.end());
int val_=js(val);
len=bianl.size();int xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao);
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;
}
else if(caozuo=="yosoro")
{
int len=more.size();
if(len==0)getline(cin,bianl);
else bianl=more;
wr(js(bianl));putchar(' ');
}
}
}
int main()
{
while(scanf("%s",s)!=EOF)
{
dycxh=1;ccs=0;
zhixing(s,0,0);
}
return 0;
}
关于 duiy
的用处,举一个简单的例子:
{ vars
a:int
b:int
}
{ hor a, 1, 2
{ hor b, 1, 2
:yosoro b
}
}
不加 duiy
的输出:
1 2 0 1 2 0
加 duiy
的输出:
1 2 1 2
如果将循环执行的语句 顺序 输出的话,那么不加 duiy
的应该是这样的(仅 hor
循环):
{ hor a, 1, 2
{ hor b, 1, 2
:yosoro b
}
{ hor b, 1, 2
:yosoro b
}
:yosoro b
{ hor b, 1, 2
:yosoro b
}
{ hor b, 1, 2
:yosoro b
}
:yosoro b
}
也就是说,循环结束之后又顺序执行了一遍循环体。
应该……不难理解吧。
感性理解一下吧。
然后就 60 分了。
这里的 duiy
统计比较浅显,没有考虑 ihu
的不成立时跳过和 while
语句。
五 .while
ihu
和 hor
打完之后,while
就很好打了。
因为 while
完全就是 ihu
和 hor
的结合体。
顺便又修改了一下 js
函数。
修复了之前说的数组下标是变量时的错误。
还完善了对于循环中的 ihu
的跳过处理。
const int inf=1e5+7;
char s[inf];
string caozuo,yuju,more,mtm;
string bianl,leix,input,hang,val;
map<string,int>num,last;
struct shuzu_{
int from,to;
vector<int>h;
};
map<string,shuzu_>shuzu;
struct chuli{
int f;
string val;
}ls[10][1000];
bool dycxh=1,in_xh;
struct xunhuan{
string __s;
int cs,ccs;
}chucun[inf];
int ccs,duiy[inf],cs_kais[inf];
int js(string _s,int dep)
{//dep 是为了递归清空不对全局变量造成影响
int len=_s.size();
int cnt=0;
for(int i=0;i<1000;i++)ls[dep][i].val.clear();
bool fir=1;
ls[dep][0].f=1;
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
if(fir&&_s[i]=='-');
else cnt++;
if(_s[i]=='+')ls[dep][cnt].f=1;
if(_s[i]=='-')ls[dep][cnt].f=-1;
continue;
}
ls[dep][cnt].val+=_s[i];
fir=0;
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
len=ls[dep][i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
string bianliang="";
for(int j=0;j<len;j++)
{
if(ls[dep][i].val[j]>='0'&&ls[dep][i].val[j]<='9')
{ss=ss*10+ls[dep][i].val[j]-48;continue;}
if(ls[dep][i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
bianliang+=ls[dep][i].val[j];
}
if(ss)ans+=ss*ls[dep][i].f;
else if(pd_shuzu)
{
string xiabiao="";
for(int j=xiab;j<len-1;j++)
xiabiao+=ls[dep][i].val[j];
int xiab_=js(xiabiao,dep+1);//递归计算
ans+=shuzu[bianliang].h[xiab_-shuzu[bianliang].from]*ls[dep][i].f;
}
else ans+=num[ls[dep][i].val]*ls[dep][i].f;
}
return ans;
}
int zhixing(string benhang,int chucuns,int cengs)
{
int lenel=benhang.size(),ii=0;
if(lenel==0)return 0;
yuju.clear();more.clear();
while(ii<lenel){if(benhang[ii]>' ')break;ii++;}
while(ii<lenel){if(benhang[ii]<=' '){ii++;break;}yuju+=benhang[ii];ii++;}
while(ii<lenel)more+=benhang[ii],ii++;
string tiaoj="",pd1="",pd2="";
if(yuju[0]=='}')cengs--;
else if(yuju[0]=='{')
{
cengs++;
int len=more.size();
if(len==0&&yuju.size())cin>>caozuo;
else
{
caozuo.clear();mtm.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]<=' '){ii++;break;}caozuo+=more[ii];ii++;}
while(ii<len){mtm+=more[ii];ii++;}
}
if(caozuo=="vars")
{
while(1)
{
getline(cin,input);
hang.clear();
int len=input.size();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='}'){cengs--;break;}
len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];
else leix+=hang[i];
}
if(leix[0]=='i')num[bianl]=0;
if(leix[0]=='a')
{
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;
if(js_to==0)shuzu[bianl].from=ls;
if(js_to==-1)break;
js_to--;
}
}
for(int i=shuzu[bianl].from;i<=shuzu[bianl].to;i++)
shuzu[bianl].h.push_back(0);
}
}
}
else if(caozuo=="ihu")
{
int len=mtm.size();
if(len==0)cin>>tiaoj>>pd1>>pd2;
else
{
tiaoj.clear();pd1.clear();pd2.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}tiaoj+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}pd1+=mtm[ii];ii++;}
while(ii<len){pd2+=mtm[ii];ii++;}
}
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
int ls1=js(pd1,0),ls2=js(pd2,0);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)
{
if(in_xh)return 1;//循环中不成立
else
{//读入时不成立
int now_cs=cengs--;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='{')now_cs++;
if(hang[0]=='}')now_cs--;
if(now_cs==cengs)break;
}
}
}
}
else if(caozuo=="hor")
{
in_xh=1;
int now_cs=cengs--;
int len=mtm.size();
string xunh,sta_,end_;
if(len==0)cin>>xunh>>sta_>>end_;
else
{
xunh.clear();sta_.clear();end_.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}xunh+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}sta_+=mtm[ii];ii++;}
while(ii<len){end_+=mtm[ii];ii++;}
}
xunh.erase(--xunh.end());
sta_.erase(--sta_.end());
int from=js(sta_,0),to=js(end_,0);
last[xunh]=num[xunh];
last[sta_]=num[sta_];
last[end_]=num[end_];
num[xunh]=from;
int kais=0,jies=0;
if(dycxh)
{
dycxh=0;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len){if(input[ii]>' ')break;ii++;}
while(ii<len)hang+=input[ii],ii++;
chucun[++ccs].__s=hang;
chucun[ccs].ccs=ccs;
chucun[ccs].cs=now_cs;
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;//统计 duiy
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;//统计 duiy
now_cs--;
}
if(now_cs==cengs)break;
}
kais=1,jies=ccs;
}
else
{
kais=chucuns;int ls_cs=now_cs-1;
for(int qwq=kais+1;qwq<=ccs;qwq++)
{
if(chucun[qwq].__s[0]=='{')now_cs++;
if(chucun[qwq].__s[0]=='}')now_cs--;
if(now_cs==ls_cs){jies=qwq;break;}
}
}
for(int i=from;i<=to;i++)
{
for(int j=kais;j<=jies;j++)
{
bool ls=zhixing(chucun[j].__s,chucun[j].ccs+1,chucun[j].cs);
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='h')
j=duiy[j];//跳过
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='w')
j=duiy[j];//跳过
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='i')
if(ls==1)j=duiy[j];//跳过
}
num[xunh]++;
}
num[xunh]=last[xunh];
num[sta_]=last[sta_];
num[end_]=last[end_];
}
else if(caozuo=="while")
{
in_xh=1;
int now_cs=cengs--;
int kais=0,jies=0;
int len=mtm.size();
if(len==0)cin>>tiaoj>>pd1>>pd2;//需要读入
else
{//转化储存
tiaoj.clear();pd1.clear();pd2.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}tiaoj+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}pd1+=mtm[ii];ii++;}
while(ii<len){pd2+=mtm[ii];ii++;}
}
if(dycxh)
{//第一次循环
dycxh=0;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len){if(input[ii]>' ')break;ii++;}
while(ii<len)hang+=input[ii],ii++;
chucun[++ccs].__s=hang;
chucun[ccs].ccs=ccs;
chucun[ccs].cs=now_cs;
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;//统计 duiy
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;//统计 duiy
now_cs--;
}
if(now_cs==cengs)break;
}
kais=1,jies=ccs;
}
else
{
kais=chucuns;int ls_cs=now_cs-1;
for(int qwq=kais+1;qwq<=ccs;qwq++)
{
if(chucun[qwq].__s[0]=='{')now_cs++;
if(chucun[qwq].__s[0]=='}')now_cs--;
if(now_cs==ls_cs){jies=qwq;break;}
}
}
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
while(1)
{
int ls1=js(pd1,0),ls2=js(pd2,0);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)break;
for(int j=kais;j<=jies;j++)
{
bool ls=zhixing(chucun[j].__s,chucun[j].ccs+1,chucun[j].cs);
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='h')
j=duiy[j];//跳过
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='w')
j=duiy[j];//跳过
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='i')
if(ls==1)j=duiy[j];//跳过
}
}
}
}
else if(yuju[0]==':')
{
caozuo.clear();mtm.clear();
int ii=1;
yuju.erase(yuju.begin());
caozuo=yuju;
if(caozuo=="set")
{
int len=more.size();
if(len==0)
{
cin>>bianl;
getline(cin,val);
}
else
{
bianl.clear();val.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]<=' '){ii++;break;}bianl+=more[ii];ii++;}
while(ii<len){val+=more[ii];ii++;}
}
bianl.erase(--bianl.end());
int val_=js(val,0);
len=bianl.size();int xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao,0);
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;
}
else if(caozuo=="yosoro")
{
int len=more.size();
if(len==0)getline(cin,bianl);
else bianl=more;
wr(js(bianl,0));putchar(' ');
}
}
return 0;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
dycxh=1;ccs=0;in_xh=0;
zhixing(s,0,0);
}
return 0;
}
可以发现,这时的 zhixing
函数有了返回值。
这是为了判断 ihu
是否需要跳过。
而且此时的 duiy
函数的统计方式也变成了由大括号直接统计,而不是通过 hor
统计。
交上之后,80 分了,两个 TLE。
六 .set
通过下载数据,可以发现,#6 的 set
的变量和数值之间没有空格,这就导致了我的处理出现奇奇怪怪的错误(我的处理是按照空格划分的)。
既然这样,反正 set
中的 ,
是绝对有的,那么就根据这个 ,
划分变量。
AC Code:
const int inf=1e5+7;
char s[inf];
string caozuo,yuju,more,mtm;
string bianl,leix,input,hang,val;
map<string,int>num,last;
struct shuzu_{
int from,to;
vector<int>h;
};
map<string,shuzu_>shuzu;
struct chuli{
int f;
string val;
}ls[10][1000];
bool dycxh=1,in_xh;
struct xunhuan{
string __s;
int cs,ccs;
}chucun[inf];
int ccs,duiy[inf],cs_kais[inf];
int js(string _s,int dep)
{
int len=_s.size();
int cnt=0;
for(int i=0;i<1000;i++)ls[dep][i].val.clear();
bool fir=1;
ls[dep][0].f=1;
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
if(fir&&_s[i]=='-');
else cnt++;
if(_s[i]=='+')ls[dep][cnt].f=1;
if(_s[i]=='-')ls[dep][cnt].f=-1;
continue;
}
ls[dep][cnt].val+=_s[i];
fir=0;
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
len=ls[dep][i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
string bianliang="";
for(int j=0;j<len;j++)
{
if(ls[dep][i].val[j]>='0'&&ls[dep][i].val[j]<='9')
{ss=ss*10+ls[dep][i].val[j]-48;continue;}
if(ls[dep][i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
bianliang+=ls[dep][i].val[j];
}
if(ss)ans+=ss*ls[dep][i].f;
else if(pd_shuzu)
{
string xiabiao="";
for(int j=xiab;j<len-1;j++)
xiabiao+=ls[dep][i].val[j];
int xiab_=js(xiabiao,dep+1);
ans+=shuzu[bianliang].h[xiab_-shuzu[bianliang].from]*ls[dep][i].f;
}
else ans+=num[ls[dep][i].val]*ls[dep][i].f;
}
return ans;
}
int zhixing(string benhang,int chucuns,int cengs)
{
int lenel=benhang.size(),ii=0;
if(lenel==0)return 0;
yuju.clear();more.clear();
while(ii<lenel){if(benhang[ii]>' ')break;ii++;}
while(ii<lenel){if(benhang[ii]<=' '){ii++;break;}yuju+=benhang[ii];ii++;}
while(ii<lenel)more+=benhang[ii],ii++;
string tiaoj="",pd1="",pd2="";
if(yuju[0]=='}')cengs--;
else if(yuju[0]=='{')
{
cengs++;
int len=more.size();
if(len==0&&yuju.size())cin>>caozuo;
else
{
caozuo.clear();mtm.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]<=' '){ii++;break;}caozuo+=more[ii];ii++;}
while(ii<len){mtm+=more[ii];ii++;}
}
if(caozuo=="vars")
{
while(1)
{
getline(cin,input);
hang.clear();
int len=input.size();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='}'){cengs--;break;}
len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];
else leix+=hang[i];
}
if(leix[0]=='i')num[bianl]=0;
if(leix[0]=='a')
{
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;
if(js_to==0)shuzu[bianl].from=ls;
if(js_to==-1)break;
js_to--;
}
}
for(int i=shuzu[bianl].from;i<=shuzu[bianl].to;i++)
shuzu[bianl].h.push_back(0);
}
}
}
else if(caozuo=="ihu")
{
int len=mtm.size();
if(len==0)cin>>tiaoj>>pd1>>pd2;
else
{
tiaoj.clear();pd1.clear();pd2.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}tiaoj+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}pd1+=mtm[ii];ii++;}
while(ii<len){pd2+=mtm[ii];ii++;}
}
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
int ls1=js(pd1,0),ls2=js(pd2,0);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)
{
if(in_xh)return 1;
else
{
int now_cs=cengs--;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;
now_cs--;
}
if(now_cs==cengs)break;
}
}
}
}
else if(caozuo=="hor")
{
in_xh=1;
int now_cs=cengs--;
int len=mtm.size();
string xunh,sta_,end_;
if(len==0)cin>>xunh>>sta_>>end_;
else
{
xunh.clear();sta_.clear();end_.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}xunh+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}sta_+=mtm[ii];ii++;}
while(ii<len){end_+=mtm[ii];ii++;}
}
xunh.erase(--xunh.end());
sta_.erase(--sta_.end());
int from=js(sta_,0),to=js(end_,0);
last[xunh]=num[xunh];
last[sta_]=num[sta_];
last[end_]=num[end_];
num[xunh]=from;
int kais=0,jies=0;
if(dycxh)
{
dycxh=0;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len){if(input[ii]>' ')break;ii++;}
while(ii<len)hang+=input[ii],ii++;
chucun[++ccs].__s=hang;
chucun[ccs].ccs=ccs;
chucun[ccs].cs=now_cs;
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;
now_cs--;
}
if(now_cs==cengs)break;
}
kais=1,jies=ccs;
}
else
{
kais=chucuns;int ls_cs=now_cs-1;
for(int qwq=kais+1;qwq<=ccs;qwq++)
{
if(chucun[qwq].__s[0]=='{')now_cs++;
if(chucun[qwq].__s[0]=='}')now_cs--;
if(now_cs==ls_cs){jies=qwq;break;}
}
}
for(int i=from;i<=to;i++)
{
for(int j=kais;j<=jies;j++)
{
bool ls=zhixing(chucun[j].__s,chucun[j].ccs+1,chucun[j].cs);
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='h')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='w')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='i')
if(ls)j=duiy[j];
}
num[xunh]++;
}
num[xunh]=last[xunh];
num[sta_]=last[sta_];
num[end_]=last[end_];
}
else if(caozuo=="while")
{
in_xh=1;
int now_cs=cengs--;
int kais=0,jies=0;
int len=mtm.size();
if(len==0)cin>>tiaoj>>pd1>>pd2;
else
{
tiaoj.clear();pd1.clear();pd2.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}tiaoj+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}pd1+=mtm[ii];ii++;}
while(ii<len){pd2+=mtm[ii];ii++;}
}
if(dycxh)
{
dycxh=0;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len){if(input[ii]>' ')break;ii++;}
while(ii<len)hang+=input[ii],ii++;
chucun[++ccs].__s=hang;
chucun[ccs].ccs=ccs;
chucun[ccs].cs=now_cs;
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;
now_cs--;
}
if(now_cs==cengs)break;
}
kais=1,jies=ccs;
}
else
{
kais=chucuns;int ls_cs=now_cs-1;
for(int qwq=kais+1;qwq<=ccs;qwq++)
{
if(chucun[qwq].__s[0]=='{')now_cs++;
if(chucun[qwq].__s[0]=='}')now_cs--;
if(now_cs==ls_cs){jies=qwq;break;}
}
}
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
while(1)
{
int ls1=js(pd1,0),ls2=js(pd2,0);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)break;
for(int j=kais;j<=jies;j++)
{
bool ls=zhixing(chucun[j].__s,chucun[j].ccs+1,chucun[j].cs);
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='h')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='w')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='i')
if(ls)j=duiy[j];
}
}
}
}
else if(yuju[0]==':')
{
caozuo.clear();mtm.clear();
int ii=1;
yuju.erase(yuju.begin());
caozuo=yuju;
if(caozuo=="set")
{
int len=more.size();
if(len==0)
{
string fuzhi="";
getline(cin,fuzhi);
bianl.clear();val.clear();
int ii=0;len=fuzhi.size();
while(ii<len){if(fuzhi[ii]>' ')break;ii++;}
while(ii<len){if(fuzhi[ii]==','){ii++;break;}bianl+=fuzhi[ii];ii++;}
while(ii<len){val+=fuzhi[ii];ii++;}
}
else
{
bianl.clear();val.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]==','){ii++;break;}bianl+=more[ii];ii++;}
while(ii<len){val+=more[ii];ii++;}
}
int val_=js(val,0);
len=bianl.size();int xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao,0);
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;
}
else if(caozuo=="yosoro")
{
int len=more.size();
if(len==0)getline(cin,bianl);
else bianl=more;
wr(js(bianl,0));putchar(' ');
}
}
return 0;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
dycxh=1;ccs=0;in_xh=0;
zhixing(s,0,0);
}
return 0;
}
七 . 数组
“你的 vector
怎么实现的?”
“就直接用啊。”
“那它如果直接是一个 9?”
“嗯?哦,我先 push_back
了 1000 个 0。”
“那你?”
“好像是哦。”
虽然这个对话有些奇怪,但我们两个都 get 到了对方的意思。
于是我就把 vector
换成了 int
数组。
其实差不多(反正都是最差解)。
AC Code:
const int inf=1e5+7;
char s[inf];
string caozuo,yuju,more,mtm;
string bianl,leix,input,hang,val;
map<string,int>num,last;
struct shuzu_{
int from,to;
int h[1007];
};
map<string,shuzu_>shuzu;
struct chuli{
int f;
string val;
}ls[10][1000];
bool dycxh=1,in_xh;
struct xunhuan{
string __s;
int cs,ccs;
}chucun[inf];
int ccs,duiy[inf],cs_kais[inf];
int js(string _s,int dep)
{
int len=_s.size();
int cnt=0;
for(int i=0;i<1000;i++)ls[dep][i].val.clear();
bool fir=1;
ls[dep][0].f=1;
for(int i=0;i<len;i++)
{
if(_s[i]<=' ')continue;
if(_s[i]=='+'||_s[i]=='-')
{
if(fir&&_s[i]=='-');
else cnt++;
if(_s[i]=='+')ls[dep][cnt].f=1;
if(_s[i]=='-')ls[dep][cnt].f=-1;
continue;
}
ls[dep][cnt].val+=_s[i];
fir=0;
}
int ans=0;
for(int i=0;i<=cnt;i++)
{
len=ls[dep][i].val.size();
int ss=0,xiab;
bool pd_shuzu=0;
string bianliang="";
for(int j=0;j<len;j++)
{
if(ls[dep][i].val[j]>='0'&&ls[dep][i].val[j]<='9')
{ss=ss*10+ls[dep][i].val[j]-48;continue;}
if(ls[dep][i].val[j]=='[')
{
pd_shuzu=1,xiab=j+1;
break;
}
bianliang+=ls[dep][i].val[j];
}
if(ss)ans+=ss*ls[dep][i].f;
else if(pd_shuzu)
{
string xiabiao="";
for(int j=xiab;j<len-1;j++)
xiabiao+=ls[dep][i].val[j];
int xiab_=js(xiabiao,dep+1);
ans+=shuzu[bianliang].h[xiab_-shuzu[bianliang].from]*ls[dep][i].f;
}
else ans+=num[ls[dep][i].val]*ls[dep][i].f;
}
return ans;
}
int zhixing(string benhang,int chucuns,int cengs)
{
int lenel=benhang.size(),ii=0;
if(lenel==0)return 0;
yuju.clear();more.clear();
while(ii<lenel){if(benhang[ii]>' ')break;ii++;}
while(ii<lenel){if(benhang[ii]<=' '){ii++;break;}yuju+=benhang[ii];ii++;}
while(ii<lenel)more+=benhang[ii],ii++;
string tiaoj="",pd1="",pd2="";
if(yuju[0]=='}')cengs--;
else if(yuju[0]=='{')
{
cengs++;
int len=more.size();
if(len==0&&yuju.size())cin>>caozuo;
else
{
caozuo.clear();mtm.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]<=' '){ii++;break;}caozuo+=more[ii];ii++;}
while(ii<len){mtm+=more[ii];ii++;}
}
if(caozuo=="vars")
{
while(1)
{
getline(cin,input);
hang.clear();
int len=input.size();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='}'){cengs--;break;}
len=hang.size();
bool pd_bl=1;
bianl.clear(),leix.clear();
for(int i=0;i<len;i++)
{
if(hang[i]==':'){pd_bl=0;continue;}
if(pd_bl)bianl+=hang[i];
else leix+=hang[i];
}
if(leix[0]=='i')num[bianl]=0;
if(leix[0]=='a')
{
int len=leix.size();
int js_to=1;
for(int i=len-1;i>=0;i--)
{
if(leix[i]>='0'&&leix[i]<='9')
{
int ls=0,cishu=1;
while(leix[i]>='0'&&leix[i]<='9')
ls+=(leix[i]-48)*cishu,cishu*=10,i--;
if(js_to==1)shuzu[bianl].to=ls;
if(js_to==0)shuzu[bianl].from=ls;
if(js_to==-1)break;
js_to--;
}
}
}
}
}
else if(caozuo=="ihu")
{
int len=mtm.size();
if(len==0)cin>>tiaoj>>pd1>>pd2;
else
{
tiaoj.clear();pd1.clear();pd2.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}tiaoj+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}pd1+=mtm[ii];ii++;}
while(ii<len){pd2+=mtm[ii];ii++;}
}
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
int ls1=js(pd1,0),ls2=js(pd2,0);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)
{
if(in_xh)return 1;
else
{
int now_cs=cengs--;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
for(int i=0;i<len;i++)
{
if(input[i]<=' ')continue;
hang+=input[i];
}
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;
now_cs--;
}
if(now_cs==cengs)break;
}
}
}
}
else if(caozuo=="hor")
{
in_xh=1;
int now_cs=cengs--;
int len=mtm.size();
string xunh,sta_,end_;
if(len==0)cin>>xunh>>sta_>>end_;
else
{
xunh.clear();sta_.clear();end_.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}xunh+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}sta_+=mtm[ii];ii++;}
while(ii<len){end_+=mtm[ii];ii++;}
}
xunh.erase(--xunh.end());
sta_.erase(--sta_.end());
int from=js(sta_,0),to=js(end_,0);
last[xunh]=num[xunh];
last[sta_]=num[sta_];
last[end_]=num[end_];
num[xunh]=from;
int kais=0,jies=0;
if(dycxh)
{
dycxh=0;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len){if(input[ii]>' ')break;ii++;}
while(ii<len)hang+=input[ii],ii++;
chucun[++ccs].__s=hang;
chucun[ccs].ccs=ccs;
chucun[ccs].cs=now_cs;
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;
now_cs--;
}
if(now_cs==cengs)break;
}
kais=1,jies=ccs;
}
else
{
kais=chucuns;int ls_cs=now_cs-1;
for(int qwq=kais+1;qwq<=ccs;qwq++)
{
if(chucun[qwq].__s[0]=='{')now_cs++;
if(chucun[qwq].__s[0]=='}')now_cs--;
if(now_cs==ls_cs){jies=qwq;break;}
}
}
for(int i=from;i<=to;i++)
{
for(int j=kais;j<=jies;j++)
{
bool ls=zhixing(chucun[j].__s,chucun[j].ccs+1,chucun[j].cs);
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='h')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='w')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='i')
if(ls)j=duiy[j];
}
num[xunh]++;
}
num[xunh]=last[xunh];
num[sta_]=last[sta_];
num[end_]=last[end_];
}
else if(caozuo=="while")
{
in_xh=1;
int now_cs=cengs--;
int kais=0,jies=0;
int len=mtm.size();
if(len==0)cin>>tiaoj>>pd1>>pd2;
else
{
tiaoj.clear();pd1.clear();pd2.clear();
int ii=0;
while(ii<len){if(mtm[ii]>' ')break;ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}tiaoj+=mtm[ii];ii++;}
while(ii<len){if(mtm[ii]<=' '){ii++;break;}pd1+=mtm[ii];ii++;}
while(ii<len){pd2+=mtm[ii];ii++;}
}
if(dycxh)
{
dycxh=0;
while(1)
{
getline(cin,input);
int len=input.size();
hang.clear();
int ii=0;
while(ii<len){if(input[ii]>' ')break;ii++;}
while(ii<len)hang+=input[ii],ii++;
chucun[++ccs].__s=hang;
chucun[ccs].ccs=ccs;
chucun[ccs].cs=now_cs;
if(hang[0]=='{')
{
now_cs++;
cs_kais[now_cs]=ccs;
}
if(hang[0]=='}')
{
duiy[cs_kais[now_cs]]=ccs;
now_cs--;
}
if(now_cs==cengs)break;
}
kais=1,jies=ccs;
}
else
{
kais=chucuns;int ls_cs=now_cs-1;
for(int qwq=kais+1;qwq<=ccs;qwq++)
{
if(chucun[qwq].__s[0]=='{')now_cs++;
if(chucun[qwq].__s[0]=='}')now_cs--;
if(now_cs==ls_cs){jies=qwq;break;}
}
}
tiaoj.erase(--tiaoj.end());
pd1.erase(--pd1.end());
while(1)
{
int ls1=js(pd1,0),ls2=js(pd2,0);
bool pd_hf=0;
if(tiaoj=="lt")if(ls1<ls2)pd_hf=1;
if(tiaoj=="gt")if(ls1>ls2)pd_hf=1;
if(tiaoj=="le")if(ls1<=ls2)pd_hf=1;
if(tiaoj=="ge")if(ls1>=ls2)pd_hf=1;
if(tiaoj=="eq")if(ls1==ls2)pd_hf=1;
if(tiaoj=="neq")if(ls1!=ls2)pd_hf=1;
if(pd_hf==0)break;
for(int j=kais;j<=jies;j++)
{
bool ls=zhixing(chucun[j].__s,chucun[j].ccs+1,chucun[j].cs);
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='h')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='w')
j=duiy[j];
if(chucun[j].__s[0]=='{'&&chucun[j].__s[2]=='i')
if(ls)j=duiy[j];
}
}
}
}
else if(yuju[0]==':')
{
caozuo.clear();mtm.clear();
int ii=1;
yuju.erase(yuju.begin());
caozuo=yuju;
if(caozuo=="set")
{
int len=more.size();
if(len==0)
{
string fuzhi="";
getline(cin,fuzhi);
bianl.clear();val.clear();
int ii=0;len=fuzhi.size();
while(ii<len){if(fuzhi[ii]>' ')break;ii++;}
while(ii<len){if(fuzhi[ii]==','){ii++;break;}bianl+=fuzhi[ii];ii++;}
while(ii<len){val+=fuzhi[ii];ii++;}
}
else
{
bianl.clear();val.clear();
int ii=0;
while(ii<len){if(more[ii]>' ')break;ii++;}
while(ii<len){if(more[ii]==','){ii++;break;}bianl+=more[ii];ii++;}
while(ii<len){val+=more[ii];ii++;}
}
int val_=js(val,0);
len=bianl.size();int xiab;
bool pd_shuzu=0;
for(int i=0;i<len;i++)
{
if(bianl[i]=='[')
{
pd_shuzu=1;xiab=i+1;
break;
}
}
if(pd_shuzu)
{
string bianliang="",xiabiao="";
for(int i=0;i<xiab-1;i++)
bianliang+=bianl[i];
for(int i=xiab;i<len-1;i++)
xiabiao+=bianl[i];
int xiab_=js(xiabiao,0);
shuzu[bianliang].h[xiab_-shuzu[bianliang].from]=val_;
}
else num[bianl]=val_;
}
else if(caozuo=="yosoro")
{
int len=more.size();
if(len==0)getline(cin,bianl);
else bianl=more;
wr(js(bianl,0));putchar(' ');
}
}
return 0;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
dycxh=1;ccs=0;in_xh=0;
zhixing(s,0,0);
}
return 0;
}
总结
个人感觉这种紫色的大模拟对于代码能力的锻炼还是很有用的。
除了过程有点折磨外,A 掉之后还是很开心的。
如果对我的代码疑问,可以私信问我。
2022 年 noip 后就要退役了。退役前还是能回复的。
大学之后可能会是不是上洛谷或博客园看看。
如果觉得这篇题解写的还可以,请不要吝啬您的点赞。
广告
标签:tiaoj,int,clear,CYaRon,ii,while,pd 来源: https://www.cnblogs.com/adm-1223/p/16333702.html