解題心得
比對解答與提交答案的部分,主要是一個字元一個字元檢查。如果兩個字元都一樣,那就往下一個字元繼續看;如果其中一個是空白但另一個不是,則可能是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; }
沒有留言:
張貼留言