★★HDU1073 Online Judge
小明现在想做一个在线评判系统,他对于每个问题都有一个正确的输入文件和用户输入的文件。如果用户文件与正确文件完全一样的话,则输出"Accepted",如果两者之间只有空格(' '), 制表符('\t'), or 换行符('\n')的区别,则输出"Presentation Error"。否则输出"Wrong Answer"。
输入:第一行为T,表以下有T个实例。对于每个实例有两部分,先是正确的文件,后是用户的文件。他们都是以单独的一行"START"开始和以单独的一行"END"结束的。中间的每行都是文件内容。
文件最多5000个字符。
输出:输出在线评判系统的评判结果。
分析:直接用scanf一个一个字符的读入所有正确文件与用户文件的所有字符,并判断结尾。然后先依次判断正确文件与用户输入文件是否一样,否则判断是否格式不同,否则是wrong answer。
AC代码:
#include<cstdio>
#include<cstring>
using namespace std;
char str1[5000+100];//正确文件
char str2[5000+100];//用户文件
bool is_four(char c)//判断空格,制表符,换行符。
{
if(c==''||c=='\t'||c=='\n')
returntrue;
returnfalse;
}
int main()
{
int t;
while(scanf("%d%*c",&t)==1&&t)//实例个数
{
while(t--)//每个实例
{
//读入正确文件
charc;
for(int i=0; i<6; i++) //读开头的start与换行符
{
c = getchar();
}
inti=0;
while(1)//读正确文件+‘\n’+“END”+‘\n’
{
str1[i]=getchar();
if(str1[i]=='\n'&&i>=4)
{
if(str1[i-4]=='\n'&&str1[i-3]=='E'&&str1[i-2]=='N'&&str1[i-1]=='D')//判断结尾
{
break;
}
}
i++;
}
intlen1=i+1;//文件长度
//读入用户文件
for(int i=0; i<6; i++) //读开头的start与换行符
{
c = getchar();
}
i=0;
while(1)//读用户文件+‘\n’+“END”+‘\n’
{
str2[i]=getchar();
if(str2[i]=='\n'&&i>=4)
{
if(str2[i-4]=='\n'&&str2[i-3]=='E'&&str2[i-2]=='N'&&str2[i-1]=='D')
{
break;
}
}
i++;
}
intlen2=i+1;
boolaccepted=true;//两个文件完全相同
if(len1!=len2)accepted=false;
if(len1==len2)
{
for(int i=0;i<len1;i++)
if(str1[i]!=str2[i])
{
accepted=false;
break;
}
}
boolP_E=true;//仅格式错误
if(!accepted)
{
int i=0,j=0;
while(1)
{
while(i<len1&&is_four(str1[i]))i++;//找到下一个非‘ ’‘\t’‘\n’字符
while(j<len2&&is_four(str2[j]))j++;//找到下一个非‘ ’‘\t’‘\n’字符
if(i>=len1&&j>=len2)
break;
else if(i>=len1||j>=len2)
{
P_E=false;
break;
}
else if(str1[i]!=str2[j])
{
P_E=false;
break;
}
else//str1[i]==str2[j]
{
i++;
j++;
}
}
}
if(accepted)printf("Accepted\n");
elseif(P_E)printf("Presentation Error\n");
elseprintf("Wrong Answer\n");
}
}
return 0;
}