解題心得
比對解答與提交答案的部分,主要是一個字元一個字元檢查。如果兩個字元都一樣,那就往下一個字元繼續看;如果其中一個是空白但另一個不是,則可能是PE,就先標記起來然後跳過空白;如果字元不一樣,而且也不是因為空白,那就是WA,可以直接跳出迴圈。
比較麻煩的是換行的部分,會造成PE誤判成AC,因為好像檢查不到「\n」。我想說這種狀況,會出現在原本被判AC,但因為換行,導致解答跟提交答案的行數不同,就從這裡判斷就好了。
程式碼
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, m, count = 1;
while (cin >> n)
{
if (n == 0) break;
cin.ignore();
string solution[100], team_output[100];
int solution_len = 0;
// read input
for (int i = 0; i < n; i++)
{
getline(cin, solution[i]);
solution_len += solution[i].size();
}
cin >> m;
cin.ignore();
for (int i = 0; i < m; i++)
getline(cin, team_output[i]);
// judge
bool pe = false, wa = false;
int i = 0, j = 0, len1 = 0, len2 = 0;
while (i < n)
{
while (len1 < solution[i].size()) // && len2<team_output[i].size()
{
if (solution[i][len1] == team_output[j][len2])
len1++, len2++;
else if (solution[i][len1] == ' ' || solution[i][len1] == '\n')
{
len1++;
pe = true;
}
else if (team_output[j][len2] == ' ' || team_output[j][len2] == '\n')
{
len2++;
pe = true;
}
else
{
wa = true;
break;
}
if (len2 >= team_output[j].size())
j++, len2 = 0;
}
i++; len1 = 0;
}
cout << "Run #" << count++ << ": ";
if (wa)
cout << "Wrong Answer ";
else if (pe || n!=m)
cout << "Presentation Error ";
else
cout << "Accepted ";
cout << solution_len << endl;
}
return 0;
}
沒有留言:
張貼留言