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

来源:互联网 发布:阿里云认证 编辑:程序博客网 时间:2024/05/22 03:28

今天我们只学了一个十分简单的内容——字母树。
如果给出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一位一位放进去。

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

1 0