对拍,可以解决程序出错而又不能靠静态差错或手造数据 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.cpp 和 WA.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 为正确输出。