题意:大模拟,说下坑吧。
1. 用HashMap/自写Hash的话就自求多福吧,有专门卡Hash的数据。有队伍的代码TLE,不知道是不是这个原因。
2. Print, Dump, Errmsg, Panic是可以作为常量名的,所以应该先判断是不是赋值式,有很多队伍因为这个而WA掉了。
3. 在双引号中虽不会出现双引号,但是会出现空格。有一部分程序因为空格问题WA掉。
4. Errmsg默认是ON, 样例中故意在两个TestCase中都显式写明了Errmsg ON, 没有特判会WA。
5. 由于很多Printable的字符是特殊字符,似乎有队伍因为这个原因WA了, 原因不明。
6. 千万不要用cin/cout进行IO, java一定要套上BufferedReader, 不然40M的数据在读入阶段就会TLE。
7. 引号里面的字符串可能有等号! 用java的同学在split中一定要注意指明最大划分段数:
String parts[] = Statement.split("=", 2);
否则是必然会WA掉的
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<iostream>
#include<string>
using namespace std;
typedef long long ll;
int T,t,n,m;
map<string,string> match[4];
char str[1010],str2[1010],s1[1010],s2[1010];
int type1,type2,Err,Over;
void init()
{
int i,j,k;
for(i=0;i<=3;i++)
match[i].clear();
Err=1;
Over=0;
}
bool Has_Equal()
{
int i,j,k,len=strlen(str);
bool flag=0,flag2=0;
for(i=0;i<len;i++)
{
if(str[i]==34)
flag2=1;
if(str[i]=='=' && flag2==0)
{
flag=true;
str[i]=' ';
}
if(str[i]==9)
str[i]=32;
}
return flag;
}
bool kong()
{
int i,j,k,len=strlen(str);
bool flag=0;
for(i=0;i<len;i++)
if(!(str[i]==' ' || str[i]==9))
return false;
return true;
}
void solve()
{
int i,j,k,len=strlen(str);
m=0;
for(i=0;i<len;i++)
if(str[i]==34)
break;
m=i;
for(i=m;i<len;i++)
if(!(str[i]==' ' || str[i]==9))
str[m++]=str[i];
str[m]='\0';
}
int main()
{
int i,j,k,pos;
string string1,string2;
scanf("%d",&T);
for(t=1;t<=T;t++)
{
if(t!=1)
printf("\n");
scanf("%d",&n);
getchar();
init();
while(n--)
{
gets(str);
solve();
if(Over==1)
continue;
if(kong())
continue;
if(Has_Equal())
{
sscanf(str,"%s %s",s1,s2);
if(s1[0]=='$')
type1=0;
else
type1=1;
if(s2[0]!=34)
type2=0;
else
type2=1;
if(type1==0)
{
match[0].erase(s1);
match[1].erase(s1);
match[type2][s1]=s2;
}
else
{
if(match[2].find(s1)==match[2].end() && match[3].find(s1)==match[3].end())
match[2+type2][s1]=s2;
else if(Err==1)
printf("WARNING: Constant %s Already Defined!\n",s1);
}
}
else
{
sscanf(str,"%s %s",s1,s2);
if(s1[0]=='P' && s1[1]=='a') //Panic
{
printf("Script was KILLED.\n");
Over=1;
}
else if(s1[0]=='E' && s2[1]=='N') //Errmsg ON
Err=1;
else if(s1[0]=='E' && s2[1]=='F') //Errmsg OFF
Err=0;
else if(s1[0]=='P') //Print
{
if(s2[0]=='$')
{
if(match[0].find(s2)!=match[0].end())
{
string1=match[0][s2];
cout<<string1<<endl;
}
else if(match[1].find(s2)!=match[1].end())
{
string1=match[1][s2];
string2=string1.substr(1,string1.length()-2);
cout<<string2<<endl;
}
else
{
printf("NULL\n");
if(Err==1)
printf("NOTICE: Undefined Variable %s.\n",s2);
}
}
else
{
if(match[2].find(s2)!=match[2].end())
{
string1=match[2][s2];
cout<<string1<<endl;
}
else if(match[3].find(s2)!=match[3].end())
{
string1=match[3][s2];
string2=string1.substr(1,string1.length()-2);
cout<<string2<<endl;
}
else
{
printf("%s\n",s2);
if(Err==1)
printf("NOTICE: Undefined Constant %s.\n",s2);
}
}
}
else if(s1[0]=='D') //Dump
{
if(s2[0]=='$')
{
if(match[0].find(s2)!=match[0].end())
{
string1=match[0][s2];
printf("integer: ");
cout<<string1<<endl;
}
else if(match[1].find(s2)!=match[1].end())
{
string1=match[1][s2];
printf("string: ");
cout<<string1<<endl;
}
else
{
printf("NULL\n");
if(Err==1)
printf("NOTICE: Undefined Variable %s.\n",s2);
}
}
else
{
if(match[2].find(s2)!=match[2].end())
{
string1=match[2][s2];
printf("integer: ");
cout<<string1<<endl;
}
else if(match[3].find(s2)!=match[3].end())
{
string1=match[3][s2];
printf("string: ");
cout<<string1<<endl;
}
else
{
printf("string: %c%s%c\n",34,s2,34);
if(Err==1)
printf("NOTICE: Undefined Constant %s.\n",s2);
}
}
}
}
}
}
}