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的类型相同。
输入描述
第一行一个正整数,表示程序的行数。
之后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; }