O(∩_∩)O哈哈~第一篇原創博客。終於結束了我“無敵轉載王”的稱號了!!!好開心!
(⊙v⊙)嗯,看到標題覺得我是神犇的人,請再次仔細看看標題,是“自動AC”,而非“AC自動”哦!這是利用lemon評測軟件的bug實現AC目標的程序。
第一次接觸到這個東西是今年暑假。我在XX學堂進行學習。一位DALAO AK了。我們都很震驚。這時一位仁兄舉報了他,我們才發現他使用了自動AC機。
話不多說,先上代碼。
#ifndef __linux__ #include<windows.h> #endif //#include<cstdlib> //#include<sys/types.h> //#include<unistd.h> #include<dirent.h> #include<string> #include<vector> #include<cstring> #include<algorithm> using namespace std; string f=__FILE__;int n,l; typedef std::pair<int,string> p; vector<p>v;char s[1000]; inline char*rread(int&r,char*s) { r=0; while(*s<'0'||*s>'9')s--; for(int b=1;*s>='0'&&*s<='9';b*=10,s--) r+=b*(*s-'0'); return s; } #include<iostream> int main() { f=f.substr(0,f.find_last_of('.',f.length())); #ifdef __linux__ DIR*dir=opendir(("../../data/"+f).c_str()); dirent*ptr; while((ptr=readdir(dir))!=NULL) if((l=strlen(ptr->d_name))>3&& (string(ptr->d_name).rfind(".out",l)==l-4|| string(ptr->d_name).rfind(".ans",l)==l-4)) { rread(n,ptr->d_name+strlen(ptr->d_name)); v.push_back(p(n,string(ptr->d_name))); } realpath(".",s); #else f=f.substr(f.find_last_of('\\',f.length())+1,f.length()); WIN32_FIND_DATA d; HANDLE hFind=FindFirstFile(("..\\..\\data\\"+f+"\\*").c_str(), &d); do if((l=strlen(d.cFileName))>3&& (string(d.cFileName).rfind(".out",l)==l-4|| string(d.cFileName).rfind(".ans",l)==l-4)){ rread(n,d.cFileName+strlen(d.cFileName)); v.push_back(p(n,string(d.cFileName))); }while (FindNextFile(hFind, &d) != 0); FindClose(hFind); GetModuleFileName(NULL,s,1000); #endif rread(n,rread(l,s+strlen(s))); sort(v.begin(),v.end()); #ifdef __linux__ system(("cp -f ../../data/"+f+'/'+v[n].second+" "+f+".out").c_str()); #else system(("copy ..\\..\\data\\"+f+'\\'+v[n].second+" "+f+".out").c_str()); #endif return 0; }
當時我們看到這個程序都驚呆了,因為根本看不懂……哪位看懂的DALAO也不用給我解釋了,反正我不會懂的……
現在,我自己研究了一下,寫了自己的簡單易懂的版本……
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char in[1000]; int main() { int num1,num2,id,n1,n2; freopen("****.in","r",stdin);//****為題目名稱 freopen("****.out","w",stdout); scanf("%d",&n1); scanf("%d",&n2); fclose(stdin); for (int i=1;i<=10;i++) { sprintf(in,"..\\..\\data\\****\\****%d.in",i); freopen(in,"r",stdin); scanf("%d%d",&num1,&num2); if (num1==n1&&num2==n2) { id=i; break; } fclose(stdin); } sprintf(in,"..\\..\\data\\****\\****%d.ans",id); freopen(in,"r",stdin); string ans; cin>>ans; cout<<ans<<endl; return 0; }
非常簡單,就是先讀入兩個數(當然可以多讀幾個,提高准確率,但一般兩個足夠了),然后進入到存數據的文件夾(即程序中的data文件夾)。利用循環,打開每一個輸入文件,對比前兩個數據,如果一樣,那么說明我們找到了正確的讀入文件(這就是為什么多讀幾個能更准確,但是一般來說前兩個數都一樣的不同兩個輸入文件太少了,所以一般兩個即可)。記下這是第幾組的輸入文件,然后打開對應的輸出數據,讀入答案,輸出。AC了!!!
