茴香豆的茴字的几种写法——BOJ1302小结

BOJ 1302 http://acm.cs.bupt.cn/onlinejudge/showproblem.php?problem_id=1302

http://forum.byr.edu.cn/wForum/disparticle.php?boardName=ACM_ICPC&ID=24794&pos=5

     鲁迅笔下的孔乙己经常在咸亨酒店里念叨着茴香豆的茴字有3种写法分别是茴 ,回 ,囘这三种。为什么他要强调茴字的多种写法呢?据我分析应该有两层含义:
一,    他是个秀才,由于受到封建思想里的“万般皆下品,唯有读书高”文化的影响,自认为比一般人懂得的要多,于是想秀一下自己渊博的知识,因为没有人理解他,只好找这个店小二下手了。
二,    他是个读书人,可能这也是一个踏实做学问人的优点——对知识求甚解,想把自己知道的东西弄的清澈透明,研究的十分透彻啦,于是他把茴字弄了个清清楚楚,明明白白。
    在学习这篇文章的时候,孔乙己的这种封建秀才的迂腐思想往往受到我们的嘲笑。当然我也不例外哈。
     其实啊,茴字不止这3种,据了解有9种,这里我就不详细的叙述了。
为什么我要谈下孔乙己了,因为我最近也孔乙己了一把。想把孔乙己这种想法应用于ACM,下面就听我细细到来。
     最近我想到了BOJ的1302,这题的出题初衷是想让大家用trie来解决的,应该说这是一个最高效的算法,但是后来想想此题其实还有另外两种(可能更多)。下面我就把这3种算法总结下。我知道对大家来说这应该算是一个简单的题目,A了的就此可以飘过了哈。
算法1: trie
这个算法的比较详细的说明在《数据结构(词语言版)》 严蔚敏 的那本书里有比较详细的说明,另外网上也有http://hi.baidu.com/silyt/blog/item/d846e4af60defbcb7cd92a1f.html。大家可以去看看,记住ACM很多时候需要自己去网上找资料的。
trie算法的思路大概如下:
对输入的长串S 想将所有长度位1-8的子串存入trie树,并在子串末节点上记录下字串出现的次数,然后针对每个输入的查询串s 只要在这颗树上查找一遍就能找到得到该子串出现的次数。附件里有trie实现的两种不同版本,有兴趣的可以仔细研究一下,这几年出现用trie来优化的题目貌似挺多的。
算法2:hash
Hash这个东东是一个很好用的算法,效率高,写法简单。大家还是要好好掌握下。
现有Hash函数非常之多,A过BOJ1003的同学们相信也清楚了,附件里把平时大家常用的hash数也总结了下。此题其实不需要多么复杂的函数,这里我采用的最简单的26进制的函数对子串进行hash,由于26^8 会超出int的范围所以在计算hash值时需要64位的整数。在算出每个子串的hash值后就将相应的slot标记好,并记录下这个slot被标记过几次,然后对各查询子串也用相同的hash函数来处理,然后查询子串所在的slot的计数器就行了。附件种有两种实现方式,一个是用hash函数配合C++ 的map来写的,这样写法简单,但是时间稍多,另外一种是用相同的hash函数+一个大数组来实现的,代码稍微复杂但是比较快。
算法3:后缀数组
也许对后缀数组的题目非集训队的成员还比较陌生,但是我想这个难不到大家,学学就会了嘛,提供点资料http://baike.baidu.com/view/1240197.htm,有关其他后缀数组及后缀树的题目大家可以在网上搜下,这方面的资料还是比较多的。下面简单的说下我的思路吧。
后缀数组,顾名思义是一个要计算字符串后缀的。先把字符串所有的后缀排好序,然后对于输入的子串查找这个子串出现在后缀数组最左和最右的位置,然后一减就是答案了。后缀数组学问最大的地放个人认为在于后缀数组的排序上,所以第一步要把这个地方弄懂以及明白各数组的含义(应为数组太多了,容易混乱)。其他的问题就水到渠成了。附件里提供一个版本的后缀数组的排序算法。其实还有更高效的排序算法,大家可以自己搜搜。
至于这三个算法的具体效果怎么样,大家实现一下就一目了然了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值