对拍

发布时间 2023-07-18 16:12:59作者: Only_Remember_Z

对拍,可以解决程序出错而又不能靠静态差错或手造数据 hack 的问题,让电脑来查找 hack 数据。

前置准备

在同一目录下的文件:AC.cpp(存储正确但可能 TLE 的代码),WA.cpp(存储你需要对拍的代码),gen.cpp(随机数生成程序,因题而异)。

代码准备

随机数程序:gen.cpp

示例代码:

int main (int argc, char *argv[]) {
  mt19937 rnd(atoi(argv[1])); // 随机种子,无论运行速度多快都是随机的
  int x; // 随机范围
  cin >> x;
  int n = rnd() % x; // 调用随机生成函数
  ......
}

AC.cppWA.cpp

略,不用freopen

正式开始对拍

新建一个 run.bat,与前面的文件在同一目录下。

注意你不能直接打开这个文件,可以考虑用记事本或其他的编辑器(VS Code 可以)。

另:它只能在 Windows 系统下执行。

代码部分

@echo off
:flag
gen %RANDOM% > test.in
ac < test.in > ans.out
wa < test.in > test.out
fc ans.out test.out
if not errorlevel 1 goto flag
pause

代码解析

  • @echo off 减少部分终端的无用输出,可以不要。
  • :flag 一个循环部分的开始。
  • gen %RANDOM% > test.in 调用 gen.cpp,生成读入文件 test.in
  • ac < test.in > ans.out 调用 AC.cpp(大小写不敏感),输入 test.in,输出 ans.out
  • wa < test.in > test.out 调用 WA.cpp,输入 test.in,输出 test.out
  • fc ans.out test.out 判断 ans.out 是否和 test.out 相同。
  • if not errorlevel 1 goto flag 如果相同,则继续执行 flag 循环;否则终止。
  • pause 在部分系统下,bat 会直接终止,这行代码会强行暂停,等待按下任意键。

调用方法

双击直接运行即可,没能 hack 的数据会被覆盖。

所以,最终剩下的就是 hack 数据了!test.in 为读入,test.out 为正确输出。