2016-8-8夏令营总结(字母树)

5 篇文章 0 订阅
2 篇文章 0 订阅

今天我们只学了一个十分简单的内容——字母树。
如果给出n个字符串(所有字符串总长度<=2000000),问有多少个不是其它的字符串的前缀。
这题我们硬做的话,就要o(n^2*当前字符串长度)
我们能可以用一种比较巧妙的方法,就是把这些字符串放进树里面。
这里写图片描述
我们依次将右边的字符串放进去。先看第一个:我们从root出发,在第一个字符串s[1]中搜到个a,看看这个点,原来有没有a的分支,有就搜a,没有开一条新的分支a,然后到达这个新开辟的点。下一个又是a,看看这个点有没有分支a,没有,就开辟……以此类推。找到最后就在结束点打下标记表示以这个点为结尾的字符串书为1
第二个字符串:从root开始,搜到1个a,看看有没有分支a,发现有,就顺着这个分支走。然后搜到b,看看这个点有没有分支b,没有,就开辟一个分支b,然后顺着分支b走……以此类推。结束打下标记。
……
这样,一个字符串入树,如果途中一直顺着找,碰到一个结束标记,就代表以这个结束标记点结束的字符串是当先字符串的前缀;当前字符串完成入树后,如果没有开辟过新的分支,就代表着当前字符串是这条路径的结尾结束标记的的对应字符串的前缀。

字母树大概就是这样了。还有就是01字母树之类的,其实也差不多。就是把一个数改成二进制后0101一位一位放进去。

字母树还是比较简单的,而且程序也十分好编,以后多做题体会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值