身为一个蒟蒻,想要在模拟赛里面考出一个 AK(痴心妄想),需要借助科技的力量。
于是“自动 AC 机”便应运而生了!
前排提示:此文章仅供娱乐,请勿在考试中作弊。否则后果自负。
好好学习,天天向上。
“自动 AC 机”的原理就类似于一个大型打表器,但表就是数据。根据输入数据到数据文件夹内逐个匹配输入,再根据输入找出对应的输出,实现 Accept 的效果。
这是 Lemon 评测的一个 BUG,亲测通过,只是比 STD 慢了亿点点。对于其他评测软件,作者不保证其准确性。
刚刚我上网搜了一下,基本都是针对题的。有一个版本是智能版的,但是不完全对。
论自动AC机 - AFOer - 博客园 (cnblogs.com)
那么,就让我来展示一下,我的全自动、傻瓜式、超级智能的“自动 AC 机”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include <bits/stdc++.h> #include <dirent.h> using namespace std;
const int BUFINF = 1e6 + 1, DFINF = 5e2 + 1; bool useStdIO, errors; string errType, dataFile[DFINF];
int getData(string path); string getInput(string path); string getExName(string s); string getInputWithoutMoreEndl(string path); void checkErr();
int main(){ useStdIO = false; string title = "<title>", iFile = title + ".in", oFile = title + ".out",
problemPath = "../../data/" + title + "/", oExName = getExName(oFile), inp = "", conStr; if(useStdIO){ string addStr = "\n"; #ifdef _WIN32 addStr = "\r\n"; #endif while(getline(cin, conStr)) inp += conStr + addStr; inp = inp.substr(0, inp.size() - 1); } else{ inp = getInputWithoutMoreEndl(iFile); freopen(oFile.c_str(), "wb", stdout); } int dataFileCNT = getData(problemPath); for(int i=1; i<=dataFileCNT; i++){ string exName = getExName(dataFile[i]); if(exName != ".in") continue; else{ string absPath = problemPath + dataFile[i], curIn = getInputWithoutMoreEndl(absPath); if(curIn == inp){ int pointPOS = dataFile[i].find("."); string ansPath = problemPath + dataFile[i].substr(0, pointPOS) + oExName, ans = getInput(ansPath); cout << ans; return 0; } } } cout << "Could not find the answer";
return 0; }
int getData(string path){ int dataFileCNT = 0; DIR *dirPath = opendir(path.c_str()); if(!dirPath){ errors = true; errType = "Could not reach the folder"; checkErr(); } dirent *dName; while((dName = readdir(dirPath))){ dataFile[++dataFileCNT] = dName -> d_name; if(dataFile[dataFileCNT] == "." || dataFile[dataFileCNT] == "..") dataFileCNT--; } closedir(dirPath); return dataFileCNT; }
string getInput(string path){ FILE *fp = fopen(path.c_str(), "rb"); if(!fp){ errors = true; errType = "Could not read from the INPUT file"; checkErr(); } char buffer[BUFINF] = {0}; while(!feof(fp)){ fread(buffer, sizeof(buffer), 1, fp); if(feof(fp)) break; } return string(buffer); }
string getInputWithoutMoreEndl(string path){ string tmp = getInput(path); int bufferLen = tmp.size() - 1; while(tmp[bufferLen] == '\n') tmp = tmp.substr(0, bufferLen--); return tmp; }
string getExName(string s){ int tmp = s.find("."); return s.substr(tmp == -1 ? 0 : tmp); }
void checkErr(){ if(errors){ cerr << errType; exit(0); } return; }
|