Output Limit Exceed与Time Limit Exceed 有点像,都是超时限制。
不同的是,TLE一般是算法出了问题,太慢了,或者某些地方陷入了死循环,导致超时,OLE一般是某地方输出陷入了死循环,或者输出没有明确的终止(一般是由于输入没有明确终止)。
举个最常见的例子:
如果题目没有说明有多少组,我们应该这么输入:
while(~scanf("%s",str)){}
while(scanf("%s",str)!=EOF){}
或者:
while(cin>>str){}
但有人输入时不加 ~符号:
while(~scanf("%s",str)){}
看似没有问题,实际这也是最典型的OLE案例;
首先我们清楚,scanf返回的是读入参数的个数,正确输入了几个参数就返回几,我们把它称为a,而通常情况下a为正整数,那么取反后结果不会为0,while可以循环。
当scanf错误读入或者读到文件结尾时(ACM测评为文件读入读出),scanf返回EOF,也就是-1,用二进制表示为11111111,对它取反,为0,while终止。
但如果不加取反运算符,那么while一直不会终止,出现OLE。