如果没遇到她

如果人生是一段没有标准样例的C++程序,那我十七岁的夏天,一定是段编译通过却处处藏着未定义行为的代码。

我曾以为我的main函数会按预定的逻辑一路执行:刷题、调参、冲省队、打NOI、拿保送,时间复杂度稳定在O(1)的单调,所有变量都在栈上规规矩矩地分配,所有分支都有明确的边界条件。教练总说我是这批选手里最稳的,代码风格像写死的const常量,从来不会犯数组越界的低级错误,空间卡得精准,连多余一个字节的内存都不肯多开。

我深以为然。作为一个浸在算法里三年的信奥生,我习惯把所有情绪都封装进私有成员,用冷静的逻辑做好访问控制,对外只暴露解题的接口。我以为高三这一年会是一次完美的深度优先搜索,沿着既定的路径一路走到底,回溯的时候只带走奖牌,不留下任何冗余数据。

直到她闯进我的机房。

那是九月初的傍晚,暑气还没褪尽,机房的旧空调嗡嗡地吹着风,键盘声叠着蝉鸣,像一段循环了无数遍的for循环。我卡在一道网络流的题上,断点打了十几个,单步执行了几十遍,还是找不出哪里建错了边。屏幕上红色的Wrong Answer刺得眼睛疼,我烦躁地揉了揉眉心,听见机房的门被轻轻推开。

“请问……这里是信息学竞赛的机房吗?”

声音很软,像夏天的风拂过键盘。我头都没抬,嗯了一声,手指还在敲调试语句。她抱着一摞作业本走到我旁边,校服袖子挽到小臂,发梢沾着点夕阳的碎金。她凑过来扫了眼屏幕,指尖轻轻点了点:“这里是不是拼错了?你把dis写成dsi了。”

我猛地顿住。一个低级到不能再低级的拼写错误,我盯着屏幕看了整整半个小时,居然被一个外行一眼指了出来。

我飞快地改过来,按下编译键。几秒钟后,绿色的Accepted跳出来,在黑底屏幕上亮得晃眼。她轻轻“哇”了一声,眼睛弯成月牙:“你好厉害啊,改一个字母就对了。”

那一瞬间,我心里像发生了一次数组越界,砰砰的心跳撞得胸腔发疼。我写过几百道AC的题目,拿过两次省一,听过无数次教练的夸奖,都没有这一句带着惊叹的“你好厉害”来得冲击力强。就像一段跑了无数遍的旧程序,突然被注入了从未有过的参数,输出了我完全没预料到的结果。

她是新来的信息课代表,叫林知夏,来收高一的作业。那天她收完作业没立刻走,站在我旁边看我写完了剩下的半道题。她看不懂算法,也看不懂复杂的建图,却安安静静的,连呼吸都放得很轻,怕打扰到我。等我敲完最后一行return 0;,转头才发现她还站着,手里攥着作业本的边角,有点不好意思地笑:“是不是耽误你时间了?”

我摇摇头,第一次觉得,机房里除了代码和算法,好像还能装下点别的东西。

从那以后,她常来机房。

有时候是收作业,顺路放一瓶冰可乐在我键盘边,瓶身的冷凝水珠顺着往下淌,在桌面上晕开一小片湿痕;有时候是抱着课本来问问题,她学的是最基础的C++语法,连for循环嵌套都写不利索,常常把循环变量ij搞混。

我给她讲指针,说指针是存放地址的变量,就像写着门牌号的纸条,拿着纸条就能找到对应的房间。她皱着眉听半天,指着我的水杯笑:“那你的手就是这个水杯的指针对不对?一伸手就能拿到它。”

我被她逗笑了。在此之前,我一直觉得C++是冰冷的语法和严苛的逻辑,是必须精准到每一个分号的规则,是0和1构成的黑白世界。可她偏要给这些冰冷的关键字裹上温度,把递归讲成跑不完的旋转楼梯,把数组讲成一排整齐的抽屉,把结构体讲成装着课本和零食的书包。

她会在晚自修课间溜过来,趴在桌边看我刷题,手指在草稿纸上画歪歪扭扭的二叉树。她问我,为什么中序遍历要左根右,不能换个顺序吗。我跟她讲遍历规则,讲树的结构,她听得似懂非懂,最后总结:“原来你们写代码的,连走路都要规定先迈左脚还是右脚啊。”

我没法跟她解释,算法的世界里,规则就是一切。差一个分号会编译失败,错一个边界会全题WA,少一个回溯点就会陷入死循环。可看着她亮晶晶的眼睛,我那些到嘴边的严谨说辞,全都咽了回去。

我开始每天下意识地留意机房门口的动静。只要门一响,哪怕我正卡在最难的状压DP上,哪怕教练正站在我身后看代码,我的注意力都会不受控制地飘过去。就像程序里植入了一个定时触发的中断函数,到了那个时间点,就会自动暂停所有进程,只等着那个身影出现。

队友调侃我,说我最近写代码都带着桃花味,scanf都比以前慢半拍。我嘴上骂他们胡说,心里却清楚,我的状态转移方程早就乱了套。原本的最优子结构里,硬生生多了一个无关的变量;原本严格的无后效性,被她的一个笑容就彻底打破。我算得清所有算法的时间复杂度,却算不清自己想她的频率。

我知道这样不对。NOI越来越近,省选就在三个月后,我的主线任务是刷题、是拿牌、是保送,不该分给旁的事情半分算力。我试着把她从我的思维里erase掉,用更重的题量把内存占满,让自己没有空余的空间去想她。可就像顽固的内存泄漏,你越是刻意free,它越是扎根在堆区深处,每一次循环结束,都会悄悄多占一点空间。

十一月的省选模拟赛,我考砸了。

最后一道动态规划大题,是我练过无数遍的模型,坐在考场上却突然脑子一片空白。眼前的状态转移方程模糊不清,晃来晃去全是她笑起来的样子。出成绩那天,教练把我叫到办公室,把成绩单拍在桌上,语气很重:“你自己看看排名!再这样下去,别说NOI金牌,省队你都进不去!”

我攥着成绩单回机房,天已经黑透了。走廊里的声控灯一盏盏亮起来,又一盏盏暗下去,像我沉到谷底的心情。

推开机房门的时候,我看见她坐在我的座位上。她手里拿着我的草稿纸,上面画满了乱七八糟的状态转移图,边角处被我无意识地写了好几个“知夏”,歪歪扭扭的,藏在一堆公式中间。

那一瞬间,烦躁、焦虑、自责全都涌了上来。我走过去一把抽过草稿纸,语气冷得像机房的空调:“谁让你碰我东西的?”

她吓了一跳,抬头看着我,眼睛睁得圆圆的。“我……我就是等你回来,想问问你考得怎么样……”

“考得怎么样跟你有关系吗?”我听见自己的声音又硬又冷,像没加任何修饰的裸指针,“你能不能别总来机房打扰我?我没时间陪你玩这些过家家的东西。你要是闲得慌,就回去背你的英语单词,别在这浪费我时间。”

她的脸一下子白了。嘴唇动了动,没说出话。眼睛慢慢红了,像蒙了一层水汽。她把放在桌上的热牛奶推到一边,小声说了句“对不起”,然后抓起书包就往外走。机房的门轻轻带上,发出很轻的一声响,像程序里一个无声的break,硬生生掐断了所有未说出口的话。

我看着她的背影消失在走廊尽头,心里像被free了一块还在使用的内存,空落落的疼。我知道我话说重了,可我不敢追出去。我怕一追出去,就再也回不到原本的轨道上。那时候我固执地认为,竞赛是我的主线任务,心动是多余的分支,只要我掐断这个分支,程序就能回到正确的流程里。

那天之后,她再也没来过机房。

我的世界重新变回了只有0和1的样子。每天七点到机房,十点半回宿舍,刷题、调bug、打模拟赛,日子像while(true)一样循环往复。我的代码又变回了以前的风格,严谨、高效、没有一丝多余的内容。教练说我状态回来了,比以前更稳,冲金大有希望。

可只有我自己知道,有个地方空了一块。就像一个被注释掉的函数,虽然不影响程序编译运行,可你清楚它就在那里——你不敢删掉,也不敢解开注释。

偶尔在走廊里遇到她,她会立刻低下头,加快脚步走过去。我也目视前方,装作没看见,可余光里全是她的影子。我无数次想停下来跟她说句对不起,想问问她信息课的作业还会不会写错变量名,想告诉她那次模拟赛不是她的错。可每次话到嘴边,都被我硬生生咽了回去。

我总想着,再等等吧。等省选结束,等NOI考完,等我拿到保送资格,一切就都来得及。我把这句没说出口的道歉,和那句更没说出口的喜欢,一起压进了栈的最深处。我以为栈是安全的,只要我不主动pop,数据就永远不会丢失。

省选很顺利,我以全省第三的成绩进了省队。名单出来那天,队友们闹着要去吃火锅,我在人群里下意识地找她的身影。教学楼灯火通明,走廊里人来人往,我找了一圈又一圈,都没看见那个扎着高马尾的影子。

后来听同班同学说,她报了文化课的冲刺班,每天都在教学楼刷题,很少来这边。我握着手机,点开她的头像,对话框里还停留在三个月前她发的“明天降温,记得多穿件外套”。我输入了又删除,删除了又输入,最后还是什么都没发出去。

算了,再等等。等NOI结束吧。

NOI在次年七月,在外地的一所大学里。我收拾行李出发那天,高三已经放了假。我在学校门口站了很久,校门口的梧桐树长得正盛,阳光透过树叶洒下来,像碎掉的代码。我没等到她,只好拖着箱子转身去车站。

比赛的三天过得很快。我发挥得很稳,所有题目都写得得心应手,就像演练了无数遍的程序,按部就班地执行着每一步。最后一场考试结束铃响的时候,我放下笔,看着屏幕上提交成功的提示,长长地舒了一口气。

走出赛场,阳光刺眼得很。我想着回去就能见到她了,心里比AC了所有题目还要轻松。我甚至想好了要跟她说什么,要把奖牌挂在她面前,要告诉她,我所有的努力里,都藏着想让她看见的心意。

可等我回到学校,一切都晚了。

机房里空荡荡的,旧空调还在嗡嗡地响,键盘上落了薄薄一层灰。我去她的班级,教室里只有几个在收拾东西的同学,说林知夏早就走了,高考完就搬了家,跟着父母去了南方,连毕业聚会都没来参加。

我脑子嗡的一声,像程序突然触发了段错误,一片空白。

我跌跌撞撞地跑回机房,坐在我以前的位置上。打开电脑,硬盘里还存着当年帮她改的作业,一个叫“练习.cpp”的文件,最后一行注释是我偷偷写的,写着“下次再写错变量名,我就一直教你”。

她从来没看到过。

桌洞里放着一个白色的信封,压在一摞草稿纸下面。信封上没写名字,只画了一个歪歪扭扭的小电脑。我拆开它,里面只有一张便签,是她的字迹,清秀又工整:

“恭喜你呀,肯定能拿到好成绩的。我就不跟你告别啦,免得打扰你备赛。
谢谢你教我写代码,我终于搞懂指针是什么了。原来有些东西,就算你握着地址,也不一定能找到对应的人。对吧?
以后也要继续写很厉害很厉害的代码哦。
再见啦。”

我捏着那张薄薄的便签,在空无一人的机房里坐了很久。窗外的蝉鸣此起彼伏,屏幕上的光标在最后一行一闪一闪,像在等我写下结局。可我什么都写不出来。

后来我拿了NOI金牌,保送了北京那所我向往了三年的大学。所有人都觉得我的高三圆满极了,是一段完美运行、零报错的程序,拿到了最好的结果。

可只有我知道,这段代码里藏着一个永远修复不了的bug。

我后来写过很多复杂的程序,做过很多大型项目,精通各种数据结构和算法,能轻松解决最棘手的问题。可我永远修不好十七岁那年的bug。

如果没遇到她,我的高三会是一段标准的正确程序。没有波澜,没有偏差,沿着既定的轨道一路向前,顺利得没有一丝遗憾。我会安安心心刷题,顺顺利利拿牌,按部就班地进入大学,像所有我认识的信奥生一样。

可遇到她之后,我才知道,原来人生不是OJ评测系统。不是所有的错误都有明确的报错信息,不是所有的遗憾都能通过回溯重来,不是所有的变量都能在析构的时候安然释放。

她是我青春里最漂亮的一次野指针访问,毫无预兆,却精准地撞进了我从未开辟的内存区域;她是我没来得及捕获的异常,没等我写出catch块,就已经让整个程序溃不成军;她是我永远释放不了的内存泄漏,在我心里占了一块位置,经年累月,从来没被覆盖过。

我写过无数个构造函数,能构造出各种各样的对象和场景,却构造不出一个能和她重新相遇的午后;我精通各种回溯算法,能回溯到任何一个状态重新选择,却回溯不到那个九月的傍晚——没能好好跟她说一句“你好”,也没能在十一月的那天,忍住脾气跟她说一句“对不起”。

有人说,C++里所有的内存泄漏,在程序结束的时候都会被操作系统回收。可人生的程序太长了,长到我要花很多很多年,才能等到最终的析构函数执行。

而在那之前,她会一直住在我堆区的最深处,带着十七岁夏天的蝉鸣、冰可乐的气泡,还有机房里没说出口的心动,永远不会被覆盖,永远不会被释放。

前几天整理旧物,我翻出了当年的草稿纸。那张被她看过的、写满公式的纸上,几个歪歪扭扭的“知夏”还清晰可见。我盯着那两个字看了很久,突然想起她当年问我的话。

她问,递归真的都有出口吗?

那时候我告诉她,当然有,没有出口的递归会栈溢出,程序会崩溃。

可现在我知道,有的递归是没有出口的。比如那段没说出口的喜欢,比如那场没来得及的告别,比如十七岁夏天里,那个穿着校服、站在机房门口的姑娘。

它在我心里循环了一年又一年,早就栈溢出了无数次,可我还是舍不得让它停下来。

如果没遇到她,我会少很多遗憾。

可如果没遇到她,我也永远不会知道,原来0和1构成的冰冷世界里,也能开出最温柔的花来。

哪怕那朵花,最后只开在了我一个人的内存里。

1 个赞

AI好用吗?

:face_with_tears_of_joy:

看得出来写的很努力,对AI的调教也很到位。不过下一次请写一点正经的文章,这种带有一些***的色彩的文章请不要写。

1 个赞

?这有啥啊

没涉黄啊,洛谷上的******文章很多啊