最近在和几个小伙伴讨论之下,一时兴起,就准备自己搭一个oj(online judge),oj的系统我们选取的是开源的hustoj。正好我也有一个闲置的vps机子,机子上就简单的弄了一个shadowsocks(干吗用的大家都懂),所以资源还是挺空的。大脑一热,就开始自己搭起oj。
github—-这是github上的开源代码,大家可以自己去看,这里我就简单说下我的安装经历。 (Continued)
最近在和几个小伙伴讨论之下,一时兴起,就准备自己搭一个oj(online judge),oj的系统我们选取的是开源的hustoj。正好我也有一个闲置的vps机子,机子上就简单的弄了一个shadowsocks(干吗用的大家都懂),所以资源还是挺空的。大脑一热,就开始自己搭起oj。
github—-这是github上的开源代码,大家可以自己去看,这里我就简单说下我的安装经历。 (Continued)
今天做了暑假第一次训练赛,感觉真的是“日了dog了”。
首先是上午一场比较简单的,题目思路出得很快,写完速度也还可以,可结果却是wa。我自己看来看去看了半天也找不出错在哪里,分步调试了好久也不知道问题在哪。无奈之下,我只好自己重新写了一遍,这次写完到是成功ac,可是时间已经过去了很久,可以说是非常的不好。后面一道题思路有了,也很快写完了,可又是出现各种问题,自己感觉并没有错,可调来调去还是不对,无奈之下,只好让旁边的小伙伴听听我的思路,这一说就马上被点醒,有一个小地方没处理好,弄完后就ac了。我这愚蠢的ac情况,遭到了旁边小伙伴狠狠地鄙视。
下午是一场难度稍微增加的训练赛,写完一道简单题以后,后面一道是比较常规的一道题,以前写过几次,但以前写法并不是最优化后的写法,可能是以前数据比较水的关系,所以以前都成功ac了,可是这次不行。这次数据卡得比较狠,把我所有的问题都暴露了出来,一次改进,不行,再改进,还不行,一次次向旁边小伙伴求助,直到把我所有写得比较暴力的地方都优化了以后,终于ac。小伙伴已经不知道该说我什么了,唉。
这种感觉真的是很挫败,题目思路来得很快,可是自己却并不能很好的把细节处理好,导致简单题写好久,常规题写好久,难题剩下时间太短,没什么时间写好代码。这赤裸裸地暴露出我基本功不行的事实,原来自己还是有些眼高手低,脚踩得不够实,所以拼得很虚。
不过也好,这场训练赛暴露了问题,也是让我放低了心态,原来自己还差得很远,加油吧,这个暑假一定要让自己改变。
最近花了些时间学习kmp算法(看毛片算法),对于没有基础的人来说,开始学一个东西都会非常痛苦,我也是这样。反反复复读了好久相关的文章,终于有些明白是怎么回事了,这里给大家推荐下我的学习路径。
首先,我推荐大家看阮一峰的博客文章——字符串匹配的kmp算法。
这篇文章篇幅不长,但写得非常清楚明白,文章中用例子给出了kmp到底是怎么操作的一个过程,不过并没有给出代码。我自己看懂了以后,就直接写了一个kmp,当然这是初级版的kmp,写得比较啰嗦,而且优化的不是很好,不过毕竟能写了呀。
其次,我再推荐大家看matrix67的文章——kmp算法详解
阮一峰的博客主要讲具体实现过程,而matrix67则简单介绍了kmp的原理是怎么回事,而且其中还给出了伪代码,也就是优化以后的kmp写法。我自己在看的时候,其实对匹配数组用前面推出后面的内容理解得不是很明白,所以我又从另外一篇 从头到尾彻底理解kmp 对照着看,这篇文章讲了实现,也讲了原理,后面还有实际代码给出,只不过篇幅比较长,容易看着看着就没耐心。
这三篇文章,他们对于匹配数组(next数组)具体的定义并不全然相同,但本质是一回事。
阮一峰定义匹配数组是前后缀最大公共子列,然后移动位数用已匹配的字符数-匹配数组的值。而matrix67则是如果后一位不匹配,就移动到哪一位,后两篇博客的next数组其实就是前后移了一位,本质相同,阮一峰的匹配就是把他们移位的情况在具体分解出来,怎么移位的告诉大家,所以本质上,他们都相同。
看完这些以后,我自己对kmp就有初步的理解,自己也能裸敲出matrix67的那套代码,接下来就是敲敲题来巩固了。
下面是我的代码:
看完阮一峰博客后写得:kmp第一次
后来写得:kmp最终版