3) return true; // 如果希望能让任何人都查看对比和RE,放开行首注释,并设定$OJ_SHOW_DIFF=true; // return true; $n = strlen($str2); $str = str_split($str2); $m = 1; for($i=0; $i<$n; $i++){ if(is_numeric($str[$i])) $m++; } return $n/$m>3; } if(!isset($_SESSION[$OJ_NAME.'_'.'user_id'])){ $view_errors = $MSG_WARNING_ACCESS_DENIED ; require("template/".$OJ_TEMPLATE."/error.php"); exit(0); } $ok = false; $id = strval(intval($_GET['sid'])); $sql = "SELECT * FROM `solution` WHERE `solution_id`=?"; $result = pdo_query($sql,$id); $row = $result[0]; $lang = $row['language']; $contest_id = intval($row['contest_id']); $isRE = $row['result']==10; $isAC = $row['result']==4 ; $mark=$row['pass_rate']*100; if($isAC) $mark=100; if((isset($_SESSION[$OJ_NAME.'_'.'user_id']) && $row && ($row['user_id']==$_SESSION[$OJ_NAME.'_'.'user_id']))||isset($_SESSION[$OJ_NAME.'_'.'source_browser'])) { $ok = true; } $spj=pdo_query("select spj from problem where problem_id=?",$row['problem_id']); if(!empty($spj)&&$spj[0][0]==2 && $OJ_HIDE_RIGHT_ANSWER && !isset($_SESSION[$OJ_NAME.'_'.'source_browser']) ){ $view_errors = "

$MSG_MARK:$mark


"; $ok = false; } /** * 把 N 个相同测试点的 RE 折叠为 "1.in~5.in: Aborted (共 5 个测试点)" */ function dedup_runtimeinfo($text, &$dedup_count) { $lines = explode("\n", $text); $buckets = array(); // reason => [testcase, ...] $other = array(); foreach ($lines as $line) { $line = trim($line); if ($line === "") continue; // 形如 "data/1001/1.in:Aborted" 或 "1.in: Segmentation fault" if (preg_match('/^(?:data\/\d+\/)?([^\s:]+(?:[.:][^\s:]+)*?):\s*(.+)$/', $line, $m)) { $tc = $m[1]; $reason = trim($m[2]); $buckets[$reason][] = $tc; } else { $other[] = $line; } } $out = array(); foreach ($other as $o) $out[] = $o; foreach ($buckets as $reason => $tcs) { $count = count($tcs); if ($count == 1) { $out[] = $tcs[0] . ": " . $reason; } else { $first = $tcs[0]; $last = $tcs[$count - 1]; $range = ($first === $last) ? $first : ($first . "~" . $last); $out[] = $range . ": " . $reason . " (共 " . $count . " 个测试点)"; $dedup_count += ($count - 1); } } return implode("\n", $out); } $view_reinfo = ""; $view_reinfo_raw = ""; // 原始(管理员/有权限者看) $view_reinfo_summary = ""; // 折叠后(普通用户看) $view_reinfo_dedup_count = 0; // 折叠掉的测试点数 $verdict_color_class = "blue"; // semantic ui color: green/red/orange/yellow/grey $result_icon = "info circle"; $verdict_tip = ""; $verdict_hints = array(); if($ok){ if($row['user_id']!=$_SESSION[$OJ_NAME.'_'.'user_id']){ $view_mail_link= "Mail the auther"; } $sql = "SELECT `error` FROM `runtimeinfo` WHERE `solution_id`=?"; $rt = pdo_query($sql,$id); $raw_error = ""; if(isset($rt[0])){ $raw_error = str_replace("\n\r","\n",$rt[0]['error']); } // === 阶段 1:基于 solution.result 给"主解释"(永远非空)=== $result_code = intval($row['result']); $is_admin_session = isset($_SESSION[$OJ_NAME."_administrator"]); $is_source_browser = isset($_SESSION[$OJ_NAME.'_'.'source_browser']); // 颜色 + 图标 switch ($result_code) { case 4: $verdict_color_class = "green"; $result_icon = "check circle"; break; case 5: // PE case 6: $verdict_color_class = "red"; $result_icon = "times circle"; break; case 7: // TLE case 8: // MLE case 9: $verdict_color_class = "yellow";$result_icon = "hourglass end"; break; case 10: $verdict_color_class = "red"; $result_icon = "bug"; break; case 11: $verdict_color_class = "grey"; $result_icon = "code"; break; case 13: $verdict_color_class = "blue"; $result_icon = "play circle"; break; default: $verdict_color_class = "blue"; $result_icon = "info circle"; } // 友好提示 switch ($result_code) { case 4: // AC $verdict_tip = "本次提交通过了所有测试点"; $verdict_hints[] = "注意时间/内存是否接近限制,考虑是否有更优的算法"; $verdict_hints[] = "可以继续挑战更高难度或查看其他人的标程"; break; case 5: // PE $verdict_tip = "输出与预期基本一致但格式不符(Presentation Error)"; $verdict_hints[] = "对照样例:每行末尾是否多/少换行"; $verdict_hints[] = "检查空格、大小写、标点符号"; $verdict_hints[] = "PE 通常是细微的格式问题,请逐字符对比"; break; case 6: // WA $verdict_tip = "输出与预期不符(Wrong Answer)"; $verdict_hints[] = "对照样例手动模拟程序执行过程"; $verdict_hints[] = "检查边界条件:n=0、n=1、极值、空输入"; $verdict_hints[] = "注意 long long 溢出、int 范围"; break; case 7: // TLE $verdict_tip = $MSG_HINT_TLE; $verdict_hints[] = "检查是否有死循环(循环变量未更新)"; $verdict_hints[] = "优化算法复杂度(如 O(n²) → O(n log n))"; $verdict_hints[] = "递归层数过深?改为迭代或加深栈"; break; case 8: // MLE $verdict_tip = $MSG_HINT_MLE; $verdict_hints[] = "大数组开在函数内(栈)?改为全局或 new"; $verdict_hints[] = "Java: 减小内存使用或调整 JVM 参数"; $verdict_hints[] = "递归太深未释放,考虑显式清理"; break; case 9: // OLE $verdict_tip = $MSG_HINT_OLE; $verdict_hints[] = "是否有死循环输出"; $verdict_hints[] = "调试用的 print/cout 是否忘记删除"; break; case 10: // RE $verdict_tip = "程序运行中发生错误(Runtime Error)"; $verdict_hints[] = "数组下标是否越界(i