众所周知,HDU等搭建在windows下的OJ系统栈小得一逼,所以我们得手动扩栈……..
其实平时比赛,如果递归爆栈了,也是可以用这个特殊技能水一水的:
G++:
int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));
C++:
#pragma comment(linker, "/STACK:102400000,102400000")
当然,如果会写手工栈,那也是极好的,然而我不会QAQ
———— 2016.8.28 更新 ————-
在BZOJ这种linux平台下,好像上面的扩栈方法不管用
于是我们可以添加如下代码:
const int main_stack=16;
char my_stack[128<<20];//À©Îª128MB
int main()
{
__asm__("movl %%esp, (%%eax);\n"::"a"(my_stack):"memory");
__asm__("movl %%eax, %%esp;\n"::"a"(my_stack+sizeof(my_stack)-main_stack):"%esp");
my_main();
__asm__("movl (%%eax), %%esp;\n"::"a"(my_stack):"%esp");
return 0;
}
然后把原来的 int main() 改成 int my_main() 即可
—————————— UPD 2017.7.3 ——————————
在g++的编译命令里加入-Wl,--stack=536870912
也可以开栈