代码改变世界

hdu3901 带通配符的匹配问题

2011-08-03 20:01 by macaroniz, 506 阅读, 0 推荐, 收藏,
摘要:这题真的非常考察对kmp算法的理解,特别记录一下。题意很简单,给一个只包含字母的文本T和一个包含字母和通配符*与?的模式p,判断T中是否包含p。解决带通配符的匹配问题有很多方法,比如编译原理中大家学过的DFN自动机,这里我们主要讨论使用KMP算法来解决这个问题。不妨先讨论通配符*。如何把通配符*加入到kmp的算法中呢?一个比较容易想到的方法是这样的:将模式p分成几个不包含*的子模式,并且分别在文本T中匹配,如果存在这么一个匹配结果,使得这些“一段段”的模式在文本中形成一些不相交的匹配,那么就意味着模式P是可以和文本T匹配的。比如文本:abxxxcd,模式:ab*cd,这里模式被分成了两个子模式 阅读全文

子树同构问题

2011-06-04 15:43 by macaroniz, 442 阅读, 0 推荐, 收藏,
摘要:大概描述就是在给定树a和树b,判定a是否与b中某棵子树同构。原出题人给的树大小为200。最开始的想法是用最小表示法来确定树a和树b的结构,然后再通过某种方法进行比较,不过发现由于a的标号与b不一定相同,因为这种想法很快就被否定掉了。不妨先假设树a的根已经确定,我们知道一棵树的根如果确定的话,那么这棵树的结构也就确定了。换了几个思路后,脑子里冒出了一个完全属于灵光一现的 想法,如果我知道a中某个节点构成的子树在b中所有同构的情况,那么我应该就可以推出a中该节点父亲和哪些节点是同构的。这样用一个简单的dp就可以搞 定。假设S[i]表示的是a中节点i构成的子树在b中同构的所有情况,数学一点的表达式就 阅读全文