发生了什么 · znzryb
2026-10-08 下午,管理端「系统事件」里冒出一串成对的记录:
> 认领失败 —— 交结果连续失败了 91 秒: arbiter HTTP 503 … invalid byte sequence for encoding "UTF8": 0x00
> 认领恢复 —— 恢复正常,这一串失败持续了 91 秒
家用评测机和服务器评测机轮流报,前后三分半钟。机器本身都好好的,队列里也没别的活卡住。查下来,罪魁是一条「运行样例」。

照着图上的编号走一遍:
1. **①** 一位同学在 `lg-p1059` 上点了「运行样例」。他想在数字之间输出空格,却写成了 `'\0'`:
```cpp
for (int i = 1; i <= n; i++) cout << a[i] << '\0';
```
2. **②** 评测机照常编译、运行、比对答案,判出「答案错误」。这一步完全没问题。
3. **③** 评测机把结果交给仲裁器,仲裁器往数据库里写这次运行的输出 —— 被数据库拒了,回给评测机一个 503。
4. **④** 评测机看到 503,以为是服务器临时抖了一下,隔一会儿再交。再被拒,再交……
5. **⑤** 一直交不上,这次运行的租约过期了,另一台评测机把它领走、从头判一遍,判出一模一样的输出,同样交不上。
6. **⑥** 三次机会用完,这条运行被标成「系统错误」。
## 两台机器轮流撞同一堵墙

紫色是家用评测机,青色是服务器评测机。每一根红箭头都是一次「交结果 → 503」。这就是系统事件里那串记录为什么两台机器交替出现:**换一台机器没有任何用**,因为程序和输入都没变,谁判都会得到同样的输出,也就带着同样的那个字节。
## 学生看到的是什么

左边是那位同学实际看到的:等了一分多钟,拿到一个「系统错误」,看起来像网站坏了。右边才是他应得的:两秒出结果,输出对比里一眼就能看出「1 2 3」被写成了「123」,自己就能找到 `'\0'` 这个笔误。
这件事最该修的就在这里:**选手代码里的一个普通错误,被我们的系统变成了一个看不懂的「系统错误」**。下一节讲为什么一个字节能有这么大的破坏力。