列表

详情


NC54393. Rie

描述

        为了创造出超级AI Reverie,算法协会的某死宅研究员发明了一种新的编程语言,称为Rie。这种语言的语法极其简单,现在我们来介绍一下。

        1.变量类型:变量类型在由初始化时的类型决定,之后不能改变。变量类型只有两种,字符串和32位无符号整数。变量名只包含大小写字母和数字,且第一个字符不能是数字,并且不能是关键字或者库函数名。字符串字面量由双引号括起来,只包含大小写字母,数字和三种标点符号(, . !),如“Hello world!",整数字面量采用十进制。

        2.表达式:形如"a opt b",a,b必须是相同类型的变量或字面量,表达式的类型跟a,b的类型相同。opt是运算符,对于整数,运算符有+(加),*(乘),对于字符串,只有+(字符串拼接,生成一个副本)。表达式不会嵌套,即a,b不会是表达式。实际程序中运算符两边并不会有空格。

        3.赋值语句:形如“a = b",a必须是一个变量,b可以是一个变量、表达式、字面量。a、b的类型必须相同。如果a尚未被创建,则程序会创建一个新变量a,类型与b的类型相同。

        4.输出语句:形如"print(a)", a可以是一个变量、表达式、字面量,调用库函数print输出a的值。
        现在有一段由该语言编写的合法程序,你需要写一个程序来编译运行并输出结果。

输入描述

第一行一个正整数,表示程序的行数。
之后T行,每行一个语句,语句长度不超过100个字符。

输出描述

输出程序运行的结果,每个print语句的输出占一行,保证至少有一个输出语句。

示例1

输入:

8
str1="Hello,"
str2="algorithm!"
print(str1+str2)
month=10
day=31
date=month*100
date=date+day
print(date)

输出:

Hello,algorithm!
1031

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 400K, 提交时间: 2021-11-02 14:35:16

#include<bits/stdc++.h>

#define FOO(x,y) for(int x=0,x##_=(int)y;x<x##_;x++)
#define FOG(x,y,z) for(register int x=y,x##_=z;x<=x##_;++x)
#define DOG(x,y,z) for(register int x=y,x##_=z;x>=x##_;--x)
#define FOR(x,y,z) for(int x=y,x##_=z;x<=x##_;++x)
#define DOR(x,y,z) for(int x=y,x##_=z;x>=x##_;--x)
#define FOR_(x,y,z,s) for(int x=y,x##_=z;x<=x##_;x+=s)
#define DOR_(x,y,z,s) for(int x=y,x##_=z;x>=x##_;x-=s)
#define FOR__(x,y,z) for(int x=y,x##_=z;x<=x##_;x<<=1)
#define EOR(x,y) for(int x##_=head[x],y=edge[x##_].e;x##_;y=edge[x##_=edge[x##_].to].e)
#define EGOR(x,y,z) for(int x##_=head[x],y=edge[x##_].e,z=edge[x##_].c;x##_;y=edge[x##_=edge[x##_].to].e,z=edge[x##_].c)
#define EOD(x,y) for(int &x##_=head[x],y=edge[x##_].e;x##_;y=edge[x##_=edge[x##_].to].e)
#define SOR(x,y) for(int x=y,x##_=y;x;x=x##_&(x-1))
#define SOO(x,y) for(int x=y,x##_=y;;x=x##_&(x-1))
#define FOB(b,y) for(int b##_=y,b=bin[b##_&-b##_];b##_;b##_&=b##_-1,b=bin[b##_&-b##_])
#define While(x) for(;x;)
#define clr(x,y) memset(x,y,sizeof(x))
#define lbd(A,s,e,x) (lower_bound(A+s,A+e+1,x)-A)
#define ubd(A,s,e,x) (upper_bound(A+s,A+e+1,x)-A)
#define uni(A,x) {sort(A+1,A+x+1);x=unique(A+1,A+x+1)-A-1;}
#define uniz(A,x) {sort(A,A+x);x=unique(A,A+x)-A;}
#define sot(A,s,e) sort(A+s,A+e+1)
#define szf(x) sizeof(x)
#define min3(x,y,z) min(min(x,y),z)
#define max3(x,y,z) max(max(x,y),z)

#define read2(x,y) read(x),read(y)
#define read3(x,y,z) read(x),read(y),read(z)
#define read4(x,y,z,w) read3(x,y,z),read(w)
#define reads(str) sf("%s",str)
#define readf(x) sf("%lf",&x)

#define ts (*this)
#define sf scanf
#define pf printf

#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define db double
#define ct clock_t
#define ck() clock()
#define rd rand()
#define rmx RAND_MAX
#define RD T*(rd*2-rmx)


using namespace std;

template<class T>bool tomin(T &x,T y){return y<x?x=y,1:0;}
template<class T>bool tomax(T &x,T y){return x<y?x=y,1:0;}
template<class T>void read(T &x){
	char c;
	x=0;
	int f=1;
	while(c=getchar(),c<'0'||c>'9')if(c=='-')f=-1;
	do x=(x<<3)+(x<<1)+(c^48);
	while(c=getchar(),c>='0'&&c<='9');
	x*=f;
}
bool mem1;
const db Pi=acos(-1);
const int maxn=105;
int eq,pl,mu;
map<string,int>Id;
int tot;
string val[maxn];
int Kid[maxn];
int vl[maxn];
char str[maxn];
int Get_Id(string s){
	if(Id.find(s)!=Id.end())return Id.find(s)->second;
	Id[s]=++tot;
	return tot;
}
int Find_eq(int l,int r){
	FOR(i,l,r)if(str[i]=='=')return eq=i;
	return eq=-1;
}
int Find_pl(int l,int r){
	FOR(i,l,r)if(str[i]=='+')return pl=i;
	return pl=-1;
}
int Find_mu(int l,int r){
	FOR(i,l,r)if(str[i]=='*')return mu=i;
	return mu=-1;
}
int cut_str(int l,int r){
	string s;
	FOR(i,l,r)s=s+str[i];
	return Get_Id(s);
}
string Get_str(int l,int r){
	if(str[l]!='"')return val[cut_str(l,r)];
	string s;
	FOR(i,l+1,r-1)s=s+str[i];
	return s;
}
int Get_num(int l,int r){
	if(str[l]<'0'||str[l]>'9')return vl[cut_str(l,r)];
	int x=0;
	// pf("Get_num:");
	FOR(i,l,r){
		x=x*10+str[i]-'0';
		// pf("%d",str[i]-'0');
	}
	// puts("");
	return x;
}
int Get_kid(int l,int r){
	if(str[l]=='"')return 1;
	if(str[l]>='0'&&str[l]<='9')return 2;
	return Kid[cut_str(l,r)];
}
bool mem2;
int main(){
	// freopen("in.txt","r",stdin);
	// cerr<<(&mem2-&mem1)/1024.0/1024<<endl;
	srand(time(NULL));
	int T,len;
	read(T);
	while(T--){
		reads(str+1);
		// puts(str+1);
		len=strlen(str+1);
		if(~Find_eq(1,len)){
			int id=cut_str(1,eq-1);
			if(~Find_mu(eq+1,len)){
				vl[id]=Get_num(eq+1,mu-1)*Get_num(mu+1,len);
				Kid[id]=2;
			}else if(~Find_pl(eq+1,len)){
				Kid[id]=max3(Kid[id],Get_kid(eq+1,pl-1),Get_kid(pl+1,len));
				if(Kid[id]==1){
					val[id]=Get_str(eq+1,pl-1)+Get_str(pl+1,len);
				}else{
					vl[id]=Get_num(eq+1,pl-1)+Get_num(pl+1,len);
				}
			}else{
				Kid[id]=max(Kid[id],Get_kid(eq+1,len));
				if(Kid[id]==1){
					val[id]=Get_str(eq+1,len);
				}else{
					vl[id]=Get_num(eq+1,len);
					// pf("vl[%d]=%d\n",id,vl[id]);
				}
			}
		}else{
			int l=7;
			len--;
			if(~Find_pl(l,len)){
				int kd=max(Get_kid(l,pl-1),Get_kid(pl+1,len));
				if(kd==1){
					cout<<Get_str(l,pl-1)+Get_str(pl+1,len)<<endl;
				}else{
					cout<<Get_num(l,pl-1)+Get_num(pl+1,len)<<endl;
				}
			}else if(~Find_mu(l,len)){
				cout<<Get_num(l,mu-1)*Get_num(mu+1,len)<<endl;
			}else{
				if(Get_kid(l,len)==1){
					cout<<Get_str(l,len)<<endl;
				}else{
					cout<<Get_num(l,len)<<endl;
				}
			}
		}
	}
	return 0;
}

上一题