信息学竞赛的常数优化、常见问题、代码风格相关

在查std::ios::sync_with_stdio(false);有关信息时,看到https://blog.csdn.net/qq_33583069/article/details/53086992 这篇博客,对其中一些问题比较感兴趣,整理了下相关资料:

  • isdigit()

https://blog.csdn.net/cupidove/article/details/43271579这里他有些信息不是很详细,代码中加了一些注释,这种写法类似Linux内核中有关此函数的实现,在原有基础上加了一些其他功能的扩展,可以看我的注释。

#include <time.h>
#include <iostream>
#include <windows.h>


using namespace std;

// 关闭 IO 同步
static const auto io_sync_off = []()
{
    // turn off sync
    std::ios::sync_with_stdio(false);
    // untie in/out streams
    std::cin.tie(nullptr);
    return nullptr;
}();

#define _ITEST_U	0x01	/* upper 大写 */
#define _ITEST_L	0x02	/* lower 小写 */
#define _ITEST_D	0x04	/* digit 十进制数 */
#define _ITEST_C	0x08	/* cntrl 不可打印的控制字符 */
#define _ITEST_P	0x10	/* punct 标点符号 */
#define _ITEST_S	0x20	/* white space (space/lf/tab) 所有空格符 */
#define _ITEST_X	0x40	/* hex digit 16/10进制数 */
#define _ITEST_SP	0x80	/* hard space (0x20) 硬空格 */

const unsigned char itest_ctype[] = {
        _ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,			/* 0-7 */
        _ITEST_C, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C,
        _ITEST_C,	/* 8-15 */
        _ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,			/* 16-23 */
        _ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,			/* 24-31 */
        _ITEST_S|_ITEST_SP,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,		/* 32-39 */
        _ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,			/* 40-47 */
        _ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,			/* 48-55 */
        _ITEST_D,_ITEST_D,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,			/* 56-63 */
        _ITEST_P, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X,
        _ITEST_U|_ITEST_X, _ITEST_U, /* 64-71 */
        _ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,			/* 72-79 */
        _ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,			/* 80-87 */
        _ITEST_U,_ITEST_U,_ITEST_U,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,			/* 88-95 */
        _ITEST_P, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X,
        _ITEST_L|_ITEST_X, _ITEST_L, /* 96-103 */
        _ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L, /* 104-111 */
        _ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L, /* 112-119 */
        _ITEST_L,_ITEST_L,_ITEST_L,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_C, /* 120-127 */
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		/* 128-143 */
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		/* 144-159 */
        _ITEST_S|_ITEST_SP, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,
        _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,	/* 160-175 */
        _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,
        _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,	/* 176-191 */
        _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U,
        _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U,	/* 192-207 */
        _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_P, _ITEST_U, _ITEST_U, _ITEST_U,
        _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_L,	/* 208-223 */
        _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L,
        _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L,	/* 224-239 */
        _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_P, _ITEST_L, _ITEST_L, _ITEST_L,
        _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L /* 240-255 */
};

#define itest_ismask(x)	(itest_ctype[(int)(unsigned char)(x)])

#define itest_isalnum(c)	((itest_ismask(c)&(_ITEST_U|_ITEST_L|_ITEST_D)) != 0)                       // alpha + digit 字母和数字
#define itest_isalpha(c)	((itest_ismask(c)&(_ITEST_U|_ITEST_L)) != 0)                                // 字母
#define itest_iscntrl(c)	((itest_ismask(c)&(_ITEST_C)) != 0)                                         // 不可打印的控制字符
#define itest_isdigit(c)	((itest_ismask(c)&(_ITEST_D)) != 0)                                         // 十进制数
#define itest_isgraph(c)	((itest_ismask(c)&(_ITEST_P|_ITEST_U|_ITEST_L|_ITEST_D)) != 0)              // 可打印非空白字符
#define itest_islower(c)	((itest_ismask(c)&(_ITEST_L)) != 0)                                         // 小写字母
#define itest_isprint(c)	((itest_ismask(c)&(_ITEST_P|_ITEST_U|_ITEST_L|_ITEST_D|_ITEST_SP)) != 0)    // 可打印字符
#define itest_ispunct(c)	((itest_ismask(c)&(_ITEST_P)) != 0)                                         // 标点符号
#define itest_isspace(c)	((itest_ismask(c)&(_ITEST_S)) != 0)                                         // 空格符
#define itest_isupper(c)	((itest_ismask(c)&(_ITEST_U)) != 0)                                         // 大写字母
#define itest_isxdigit(c)	((itest_ismask(c)&(_ITEST_D|_ITEST_X)) != 0)                                // 16/10进制
#define itest_tolower(c)	(itest_isupper((c)) ? ((c) + 'a' - 'A') : (c))                              // 转小写(如果可以)
#define itest_toupper(c)	(itest_islower((c)) ? ((c) + 'A' - 'a') : (c))                              // 转大写(如果可以)

int main()
{
    const char* demo_string = "abcd123AB 2";
    char* ptr = (char*)demo_string;

    for (int i = 0; i < strlen(demo_string); i++,ptr++)
    {
        if (itest_isdigit(*ptr))
        {
            printf("%c is digit\n",*ptr);
        }
        else if (itest_isprint(*ptr))
        {
            if (itest_islower(*ptr))
            {
                printf("%c is lower\n",*ptr);
            }
            else if (itest_isupper(*ptr))
            {
                printf("%c is isupper\n",*ptr);
            }
        }
    }

    return 0;
} 

其中还涉及到了正则表达式的一些知识:http://baiy.cn/utils/_regex_doc/index.htm

ASCII标准表 :https://baike.baidu.com/item/ASCII

  • max()/min()

https://blog.csdn.net/a_ran/article/details/74911031

https://www.iteblog.com/archives/237.html

  • unique()/lower_bound()/upper_bound()

https://blog.csdn.net/sicofield/article/details/8740141

https://blog.csdn.net/Xiaohei00000/article/details/51010292

  • scanf()/printf()

https://wu-yudong.iteye.com/blog/1974368

  • cin/cout

https://blog.csdn.net/YinJianxiang/article/details/76436089

https://www.cnblogs.com/ncgds/p/5759551.html

尾递归优化:

http://www.ruanyifeng.com/blog/2015/04/tail-call.html

http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值