論自動AC機


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了!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM