我的 杭电AC自动机(Powered By HC TECH : AutoACer Engine)

昨天发现了一个叫做ACJudge的网站上面提供了HDOJ的大部分题目的正确代码,于是写了一个小小的工具遍历了一遍,最后获取到了3591个可用的代码。

主抓取引擎代码(写的很乱X_X...)

#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;

int system(string s)
{
    char* p=new char[s.size()+8];
    memset(p,0,s.size()+8);
    strcpy(p,s.c_str());
    int ret=system(p);
    delete[] p;
    return ret;
}
char buffer[409600];
char code[409600];

void Deal()
{
    FILE* fp=fopen("D:/xxx.txt","r");
    FILE* ofp=fopen("D:/output_re.txt","w");
    memset(buffer,0,409600);
    while(fgets(buffer,409600,fp)>0)
    {
        if(strstr(buffer,"<pre><code>")==NULL) {memset(buffer,0,409600);continue;}
        else break;
    }
    char* p=buffer;
    char* q;
    string finalcode;
    while(1)
    {
        if(strstr(p,"</div>")<strstr(p,"<span")) finalcode+='\n';
        p=strstr(p,"<span");
        if(p==nullptr) break;
        p=strstr(p,">")+1;
        q=strstr(p,"</span>");
        memset(code,0,409600);
        strncpy(code,p,q-p);
        finalcode+=code;
        p=q+7;
    }
    fprintf(ofp,"%s\n",finalcode.c_str());
    fclose(fp);
    fclose(ofp);
}
void htmldecode()
{
    FILE* fp=fopen("D:/output_re.txt","r");
    FILE* ofp=fopen("D:/output_decoded.txt","w");
    int c;
    while((c=fgetc(fp))!=EOF)
    {
        if(c=='&')
        {
            int a=fgetc(fp);
            if(a=='a')
            {
                int b=fgetc(fp);
                if(b=='m')
                {
                    fputc('&',ofp);
                    fgetc(fp);//p
                }
                else //p
                {
                    fputc('\'',ofp);
                    fgetc(fp);//o
                    fgetc(fp);//s
                }
            }
            else if(a=='c')
            {
                int b=fgetc(fp);
                if(b=='e')
                {
                    fprintf(ofp,"¢");
                    fgetc(fp);//n
                    fgetc(fp);//t
                }
                else //o
                {
                    fprintf(ofp,"©");
                    fgetc(fp);//p
                    fgetc(fp);//y
                }
            }
            else if(a=='e')
            {
                fprintf(ofp,"€");
                fgetc(fp);//u
                fgetc(fp);//r
                fgetc(fp);//o
            }
            else if(a=='d')
            {
                fprintf(ofp,"÷");
                fgetc(fp);//i
                fgetc(fp);//v
                fgetc(fp);//i
                fgetc(fp);//d
                fgetc(fp);//e
            }
            else if(a=='g')
            {
                fputc('>',ofp);
                fgetc(fp);//t
            }
            else if(a=='l')
            {
                fputc('<',ofp);
                fgetc(fp);//t
            }
            else if(a=='n')
            {
                fputc(' ',ofp);
                fgetc(fp);//b
                fgetc(fp);//s
                fgetc(fp);//p
            }
            else if(a=='p')
            {
                fprintf(ofp,"£");
                fgetc(fp);//o
                fgetc(fp);//u
                fgetc(fp);//n
                fgetc(fp);//d
            }
            else if(a=='q')
            {
                fputc('\"',ofp);
                fgetc(fp);//u
                fgetc(fp);//o
                fgetc(fp);//t
            }
            else if(a=='r')
            {
                fprintf(ofp,"®");
                fgetc(fp);//e
                fgetc(fp);//g
            }
            else if(a=='s')
            {
                fprintf(ofp,"§");
                fgetc(fp);//e
                fgetc(fp);//c
                fgetc(fp);//t
            }
            else if(a=='t')
            {
                int b=fgetc(fp);
                if(b=='i')
                {
                    fprintf(ofp,"×");
                    fgetc(fp);//m
                    fgetc(fp);//e
                    fgetc(fp);//s
                }
                else//r
                {
                    fprintf(ofp,"™");
                    fgetc(fp);//a
                    fgetc(fp);//d
                    fgetc(fp);//e
                }
            }
            else //y
            {
                fprintf(ofp,"¥");
                fgetc(fp);//e
                fgetc(fp);//n
            }
            fgetc(fp);//;
        }
        else
        {
            fputc(c,ofp);
        }
    }
    fclose(fp);
    fclose(ofp);
}
int main(int argc,char** argv)
{
    if(argc<2)
    {
        printf("No input.\n");
        return 0;
    }
    string cmd="C:/curl ";
    string ss=argv[1];
    cmd+="http://www.jtahstu.com/acoj/show.php?pid="+ss+" > D:/xxx.txt";
    system(cmd);
    Deal();
    htmldecode();
    return 0;
}
先抓取,然后Deal()提取代码主体,htmldecode()进行HTML Decode.


下面是引导设备代码(控制引擎循环...)

#include <iostream>
#include <thread>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

int system(string s)
{
    char* p=new char[s.size()+8];
    memset(p,0,s.size()+8);
    strcpy(p,s.c_str());
    int ret=system(p);
    delete[] p;
    return ret;
}
char intstr[128];
char cmd[256];
int main()
{
    for(int i=1000;i<5505;i++)
    {
        sprintf(intstr,"%d",i);
        sprintf(cmd,"D:/KKK/main.exe %s",intstr);
        system(cmd);
        sprintf(cmd,"copy D:\\output_decoded.txt D:\\KKK");
        system(cmd);
        sprintf(cmd,"rename D:\\KKK\\output_decoded.txt %d_autoAC.cpp",i);
        system(cmd);
        //this_thread::sleep_for(chrono::seconds(1));
    }
    return 0;
}


接下来是检测获取到的代码是否为空
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int getfilesize(const char* Filename)
{
    FILE* fp=fopen(Filename,"r");
    if(fp==nullptr) return -1;
    else
    {
        fseek(fp,0L,SEEK_END);
        int L=ftell(fp);
        fclose(fp);
        return L;
    }
}

char name[256];
int main()
{
    for(int i=1000;i<5505;i++)
    {
        sprintf(name,"D:\\KKK\\%d_autoAC.cpp",i);
        int L=getfilesize(name);
        if(L>=0&&L<10)
        {
            sprintf(name,"RENAME D:\\KKK\\%d_autoAC.cpp %d_empty.txt",i,i);
            printf("Deleting %d...\n",i);
            system(name);
        }
    }
    return 0;
}


所有获取到的代码都将上传到GitHub上( Kiritow/OJ-Problems-Source


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值