ACM 外挂模板技巧篇

Posted 小坏蛋_千千

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM 外挂模板技巧篇相关的知识,希望对你有一定的参考价值。

输入输出外挂

普通版

namespace IO

    template <typename T>
    inline bool scan_d (T &ret)
    
        char c;
        int sgn;
        if (c = getchar(), c == EOF)return false; //EOF
        while (c != '-' && (c < '0' || c > '9') )
            if((c = getchar()) == EOF) return false;
        sgn = (c == '-') ? -1 : 1;
        ret = (c == '-') ? 0 : (c - '0');
        while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
        ret *= sgn;
        return true;
    

    template<typename T>
    void print(T x)
    
        static char s[33], *s1;
        s1 = s;
        if (!x) *s1++ = '0';
        if (x < 0) putchar('-'), x = -x;
        while(x) *s1++ = (x % 10 + '0'), x /= 10;
        while(s1-- != s) putchar(*s1);
    

    template<typename T>
    void println(T x)
    
        print(x);
        putchar('\\n');
    
;

 

fread 加强版

namespace IO

    const int MT = 10 * 1024 * 1024;  /// 10MB 注意输入数据的大小!!!
    char IO_BUF[MT];
    int IO_PTR, IO_SZ;
    /// 输入前记得调用 begin !!!
    void begin()
    
        IO_PTR = 0;
        IO_SZ = fread (IO_BUF, 1, MT, stdin);
    

    template<typename T>
    inline bool scan_d (T & t)
    
        while (IO_PTR < IO_SZ && IO_BUF[IO_PTR] != '-' && (IO_BUF[IO_PTR] < '0' || IO_BUF[IO_PTR] > '9'))
            IO_PTR ++;
        if (IO_PTR >= IO_SZ) return false;
        bool sgn = false;
        if (IO_BUF[IO_PTR] == '-') sgn = true, IO_PTR ++;
        for (t = 0; IO_PTR < IO_SZ && '0' <= IO_BUF[IO_PTR] && IO_BUF[IO_PTR] <= '9'; IO_PTR ++)
            t = t * 10 + IO_BUF[IO_PTR] - '0';
        if (sgn) t = -t;
        return true;
    

    inline bool scan_s (char s[])
    
        while (IO_PTR < IO_SZ && (IO_BUF[IO_PTR] == ' ' || IO_BUF[IO_PTR] == '\\n') ) IO_PTR ++;
        if (IO_PTR >= IO_SZ) return false;
        int len = 0;
        while (IO_PTR < IO_SZ && IO_BUF[IO_PTR] != ' ' && IO_BUF[IO_PTR] != '\\n')
            s[len ++] = IO_BUF[IO_PTR], IO_PTR ++;
        s[len] = '\\0';
        return true;
    

    template<typename T>
    void print(T x)
    
        static char s[33], *s1;
        s1 = s;
        if (!x) *s1++ = '0';
        if (x < 0) putchar('-'), x = -x;
        while(x) *s1++ = (x % 10 + '0'), x /= 10;
        while(s1-- != s) putchar(*s1);
    

    template<typename T>
    void println(T x)
    
        print(x);
        putchar('\\n');
    
;

 

strtok + sscanf

int ins_read(char *buf,int *a)  //返回整数个数,输入请用 gets

    int tot = 0;
    char *p = strtok(buf," ");
    while(p)
    
        sscanf(p,"%d",a+tot++);
        p = strtok(NULL," ");
    
    return tot;

 

手动加栈

==PS: 旁门左道,谨慎使用!!!==

 

C++

#pragma comment(linker, "/STACK:1024000000,1024000000")     //放在第一行

 

G++

int __size__ = 256<<20;         // 和系统有关,不一定适用
char *__p__ = (char*)malloc(__size__) + __size__;
__asm__("movl %0,%%esp\\n"::"r"(__p__));

以上是关于ACM 外挂模板技巧篇的主要内容,如果未能解决你的问题,请参考以下文章

acm的STL应用之vector篇

输入输出外挂模板

算法笔记--快读(输入外挂)模板

给佳能相机加一个功能外挂——魔灯安装篇

游戏外挂篇:如何Dump内存获得游戏的辅助

利用Python做绝地科学家(外挂篇)