终于搞定了Ural 1307 Archiver
Friday, 14. July 2006, 18:38:16

一年以前还在高中搞信息学竞赛的时候就有了这道题,当时觉得一点思路都没有,感觉是没法解决的。后来看到discuss里面说压缩之类的也没大明白。
前几天想回过头来做点Ural上面的题,第一个就看到了这个,于是就想把他办掉。不过压缩算法是我从来没接触过的,查了一些资料,也找到了一些这方面的文章和论文。看了一下对信息论的那些东西没大搞明白。不过把LZ77压缩算法看懂了。昨天晚上就试着做了一下。结果弄了半天都没有过,总是Wrong Answer on Test 1。有点搞不懂是为什么,自己作的几个测试数据都没有问题。当时已经2点多了,就没在做。
今天起床后继续,发现当那一串字符的长度在20000左右的时候压缩的效果并不明显,甚至增大了体积。把dictionary和buffer的大小都调大了一些,结果压缩的好了,花的时间也长了,Time Limit Exceeded on Test 3。又研究了一下gzip对LZ77的那几个改进,看了看gzip的源码,稍微有点思路怎么弄了,不过到了该去学文化课的时间了,就没在去管他。并且觉的这些改进都有些麻烦,感觉思路很乱,有点想放弃了。
不过我还是有点不甘心,所以下午去图书馆的时候在路上一直想细节上怎么去继续优化,结果在回来的路上终于想明白了。于是从晚上11点多又开始做,经过改进后的算法在dictionary和buffer的大小不变的情况下,压缩率明显提高,不过碰到了一些小问题让我调试了好久。最终还是成功了,真是让我激动万分。可能是由于这个题目的难度所导致,也有可能是因为做了这么久才做出来,我感觉从来没有哪次做出一个题目或者编出一个程序而让我如此激动过。
顺便截了个图,贴上来庆祝一下。














