Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6534 Accepted Submission(s): 2472
4 START 1 + 2 = 3 END START 1+2=3 END START 1 + 2 = 3 END START 1 + 2 = 3 END START 1 + 2 = 3 END START 1 + 2 = 4 END START 1 + 2 = 3 END START 1 + 2 = 3 END
Presentation Error Presentation Error Wrong Answer Presentation Error
对于熟悉string类及其函数、getline、erase、何时用getchar()读掉换行符等等有些帮助,1A过开森
思路:首先明确AC、WA、PE的文本到底差在什么地方..建两个string数组,分别储存多行ac代码和user代码,重点就在储存这里。既然用了getline那么换行符是会被读进去,但是又会被自动替换成空气(空格、制表符可以倒是完全正常读取并储存),因此结果是什么都没有,但只是结果,读取还是可以的,所以一旦读取之后变成了什么都没有,那么这肯定是个换行符,那你手动补上一个换行符即可。其次就是注意getchar什么时候用,F9单步调试调试相信会知道的
代码:
#include<iostream> #include<string> #include<algorithm> #include<cmath> #include<sstream> using namespace std; void era(string &s)//WA和PE的就用这个擦除空格回车制表符的函数来决定了 { while (s.find_first_of(" \n\t")!=string::npos) { s.erase(s.find_first_of(" \n\t"),1); } } int main(void) { int t,i,j,ai,ui; bool ok; cin>>t; getchar(); while (t--) { string ac[1000],user[1000],ts,cmpa,cmpu; ai=0;//ac行数初始化 while (getline(cin,ts))//用临时变量可解决开始结尾甚至换行符问题 { if(ts=="START") continue; else if(ts=="END") break; else if(ts=="") user[ui++]="\n"; else ac[ai++]=ts; } ui=0;//user行数初始化 while (getline(cin,ts)) { if(ts=="START") continue; else if(ts=="END") break; else if(ts=="") user[ui++]="\n"; else user[ui++]=ts; } ok=1;//假设AC for (j=0; j<max(ai,ui); j++) { if(user[j]!=ac[j]) { ok=0; break; } } if(ok) { cout<<"Accepted"<<endl; } else { for (i=0; i<ai; i++) cmpa=cmpa+ac[i]+'\n'; for (i=0; i<ui; i++) cmpu=cmpu+user[i]+'\n'; era(cmpa);//去掉\n\t空格 era(cmpu);//去掉\n\t空格 if(cmpa!=cmpu)//去掉还不想等,肯定WA { cout<<"Wrong Answer"<<endl; } else//否则PE { cout<<"Presentation Error"<<endl; } } } return 0; }