ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CYaRon!语

2022-06-01 11:31:07  阅读:165  来源: 互联网

标签:tiaoj int clear CYaRon ii while pd


CYaRon!语

开始之前

上次水了些小模拟之后感觉不能再颓废了,于是就来大模拟。

然后这个题花了我一个多星期

还是最差解

不过,为了纪念我的第 20 道紫题,纪念我这一周的努力,我还是想写篇题解,记录我的一点一滴。

大致思路

模拟题,都是根据题意直接模拟的(雾。

这个题呢,就适合分步完成。

关于变量

用的变量大都是汉语拼音或者缩写或者半缩写(比较好调)。

有些地方没加注释就可以直接读拼音理解含义。

成长过程

一 . 输出,变量,赋值

刚开始我是这么想的:

先把变量、数组和赋值、输出打完。

  1. 输出

    直接将表达式的值计算出来输出即可。

  2. 变量和数组

    用到了两个 map,用来映射 string 和 int 或者 array 之间的关系。

  3. 赋值

    和输出差不多,将变量名储存下来,计算出后边表达式的值即可。

具体看代码(不保证正确)

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

ihuhor 打完之后,while 就很好打了。

因为 while 完全就是 ihuhor 的结合体。

顺便又修改了一下 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有