有更新
注意不是AC自動機!
AC自動機是種高級算法,我所介紹的是種作弊方法。
這是一種非常玄學的東西,是用Pascal語言寫的用來卡評測機的東西,卡軟件BUG,以此來作弊使自己“AC”。
不過只能卡Cena,其他的力有未逮。
現在基本沒用了(時代更新太快,bug都修復了)
但也因為它是老古董,所以才又翻出來,收藏一下也是好的,畢竟是當年OIer們的智慧成果。
如果要實際應用的話,注意改一下
這是我校大神,轉載注明出處www.cnblogs.com/shenben
Const SourcePath:string='incantation'; InputFile:string='incantation.in'; OutputFile:string='incantation.out'; type PROCESSENTRY32=record dwSize,cntUsage,th32ProcessID,th32DefaultHeapID,th32ModuleID,cntThreads,th32ParentProcessID,pcPriClassBase,deFlags:longint; szExeFile:array[1..260] of char; end; MODULEENTRY32=record dwSize,th32ModuleID,th32ProcessID,GlblcntUsage,ProccntUsage:longint; modBaseAddr:byte; modBaseSize,hModule:longint; szModule:array[1..256] of char; szExePath:array[1..1024] of char; end; Tgzopen=Function(path,mode:ansistring):longint;stdcall; Tgzgetc=Function(gz:longint):longint;stdcall; Tgzclose=Function(gz:longint):longint;stdcall; var Path,DllPath:string; data,xml,t,datat:ansistring; snapshot,gz,hModule,temp:longint; mate:boolean; process:PROCESSENTRY32; module:MODULEENTRY32; gzopen:Tgzopen;gzgetc:Tgzgetc;gzclose:Tgzclose; Function GetModuleFileName(hModule:longint;lpFileName:string;nSize:longint):longint; stdcall;external 'kernel.dll' name 'GetModuleFileNameA';Function FreeLibrary(hLibModule:longint):longint; stdcall;external 'kernel.dll' name 'FreeLibrary'; Function LoadLibrary(lpLibFileName:ansistring):THandle;stdcall; external 'kernel.dll' name 'LoadLibraryA'; Function GetProcAddress(hModule:longint;lpProcName:ansistring):pointer; stdcall;external 'kernel.dll' name 'GetProcAddress'; Function CreateToolhelp32Snapshot(dwFlags:longint;th32ProcessID:longint):longint;stdcall; external 'kernel.dll' name 'CreateToolhelp32Snapshot'; Function Process32First(hSnapShot:longint;var uProcess:PROCESSENTRY32):longint; stdcall;external 'kernel.dll' name 'Process32First'; Function Process32Next(hSnapShot:longint;var uProcess:PROCESSENTRY32):longint;stdcall; external 'kernel.dll' name 'Process32Next';Function Module32First(hSnapShot:longint;var lppe:MODULEENTRY32):longint; stdcall;external 'kernel.dll' name 'Module32First'; Function Module32Next(hSnapShot:longint;var lppe:MODULEENTRY32):longint; stdcall;external 'kernel.dll' name 'Module32Next'; BEGIN GetModuleFileName(0,path,260); path:=path[0]+Copy(path,1,pos('\tmp\',path)); snapshot:=CreateToolhelp32Snapshot(2,0); process.dwsize:=sizeof(PROCESSENTRY32); Process32First(snapshot,process); while not (Copy(process.szExeFile,1,8)='cena.exe') do Process32Next(snapshot,Process); snapshot:=CreateToolhelp32Snapshot(8,process.th32ProcessID); module.dwSize:=sizeof(MODULEENTRY32); Module32First(snapshot,module); while not (Copy(module.szmodule,1,9)='zlib1.dll') do Module32Next(snapshot,module); Dllpath:=Copy(module.szExePath,1,pos('zlib1.dll',module.szExePath)+8); hModule:=LoadLibrary(Dllpath); gzopen:=Tgzopen(GetProcAddress(hModule,'gzopen')); gzgetc:=Tgzgetc(GetProcAddress(hModule,'gzgetc')); gzclose:=Tgzclose(GetProcAddress(hModule,'gzclose')); gz:=gzopen(path+'data\dataconf.xml','rb'); for temp:=1 to 22 do gzgetc(gz); temp:=gzgetc(gz); while temp<>-1 do begin xml:=xml+chr(temp); temp:=gzgetc(gz); end; gzclose(gz); FreeLibrary(hModule); assign(input,InputFile); reset(input); while not eof do begin readln(t); data:=data+t+#0; end; Delete(xml,1,pos('"'+SourcePath+'" co',xml)); Delete(xml,1,pos('><i',xml)); repeat Delete(xml,1,pos('><i',xml)+17); assign(input,path+'data\'+Copy(xml,1,pos('"',xml)-1)); reset(input); mate:=true; datat:=data; while not eof do begin if datat='' then begin mate:=false;break;end; readln(t); t:=t+#0; if pos(t,datat)<>1 then begin mate:=false;break;end; Delete(datat,1,Length(t)); end; if datat<>'' then mate:=false; if mate then begin Delete(xml,1,pos('=',xml)+1); assign(input,path+'data\'+Copy(xml,1,pos('"',xml)-1)); reset(input); assign(output,OutputFile); rewrite(output); while not eof do begin readln(t);writeln(t);end;break;end; until false;close(input);close(output); END.
具體改哪里我也不清楚·······································自己去他博客看下吧,我只是個蒟蒻
/*************************更新****************************/
qwq
前段時間無聊,又去網上搜AC自動機的相關介紹
然后搜到了這個qwq
好像更加適合實戰的說……而且非常簡單
嘛,也算是轉載注明出處了qwq
收藏收藏
原理:
先讀入n個數字(假設存在數組x[]里面),然后進入到評測軟件的存數據的文件夾里面(一般文件夾名字叫data)
利用循環打開每一個輸入文件,對比前n個數字,如果相同,那么基本可以確定找到了正確的讀入文件(顯然n越大准確率越高qwq)
記下這是第幾組的輸入文件,然后打開對應的輸出數據讀取內容,而后輸出
AC……
//****代表輸入輸出文件名 #include <cstdio> #include <string> #include <iostream> char in[100001]; int x[10],id; std::string ans; int main() { freopen("****.in","r",stdin); freopen("****.out","w",stdout); for(int i=0;i<10;++i) scanf("%d",&x[i]); fclose(stdin); for(int i=1;i<=10;++i)//這里需要循環的范圍是輸入文件的個數 { sprintf(in,"..\\..\\data\\****%d.in",i); freopen(in,"r",stdin); for(int xx,j=0;j<10;++j) { scanf("%d",&xx); if(x[j]!=xx)id=-1; } if(id==-1)continue; id=i; break; fclose(stdin); } sprintf(in,"..\\..\\data\\****%d.ans",id); freopen(in,"r",stdin); std::cin>>ans; std::cout<<ans; //最后這部分輸出僅適用於“輸出一個數”的情況,其他情況需要修改(不是什么難事qwq) return 0; }
