UOJ Logo WrongAnswer的博客

博客

为什么开O2比不开O2慢?

2017-01-31 12:12:58 By WrongAnswer

WC滚粗前的倒数第二帖

UOJ#103先求后缀数组,预处理height数组的Sparse Table,然后用Manacher找出每一个回文串在后缀数组中二分,结果TLE了。

http://uoj.ac/submission/124418

(后来改成在单调栈上二分过了 http://uoj.ac/submission/124428

本机上构造了一组数据 $s=\mathrm{abacabadabacaba...}$($|s|=300000$),跑不到 $1\texttt{s}$ 就跑出来了。在UOJ自定义测试里面运行了 $1\sim 1.1\texttt{s}$。

感觉很奇怪,难道是O2变慢了?

于是本机开了O2,也要跑 $1.1\sim 1.2\texttt{s}$。UOJ自定义测试里面加上 __attribute__((optimize("-O0"))) 以后,也只要 $0.7\sim 0.9\texttt{s}$ 了。

加上 __attribute__((optimize("-O0"))) 以后卡过去了,而且还不一定能卡过去。

http://uoj.ac/submission/124462

另外UOJ#201的题面 $v_4$ 应该改成 $v_3$

评论

__debug
g++ 6.3.1 with -std=c++98 很正常... 感觉是 4.8.4 的 bug
riteme
GCC 5.4.0也没有问题啊...... 还有我好像构造了假的数据,为什么我去试就只用0.4s,而且用`#pragma GCC optimize(0)`后就变成0.5s了,是不是UOJ当时抽了.....
qmqmqm
似乎是uoj的时间不准确?你在uoj上多测几次试试,同样的毫无随机性的代码用时能从0.7s偏差到1.3s。。

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。