SimilarNames

作者 : 翁伊嘉

关键词 : 状压, 状态优化

题目概述

输入个字符串,现在需要给它们从标号,满足条形如 标号为的字符串是标号为的字符串的前缀 的限制。求标号方案数,模输出。

,字符串长度

分析

考虑到前缀限制,容易想到先将给定字符串之间的前缀关系处理出来。添加一个空串为根,所有串之间的前缀关系构成了一个树的结构。

令有特殊限制的字符串总个数为,确定了这个字符串是哪些字符串后,剩下的字符串可以任意地给予编号,只要最后给答案乘上即可。

注意到题中的,也就是不超过个,于是可以在树上进行状压。用表示在以为根的子树中选出个字符串,对应到所代表的标号集合的方案数。

考虑前缀限制,一个分配标号方案是合法的,当且仅当对于每一对限制,在前缀树上是的祖先。由于我们的是以子树为状态的,考虑进一步转化这个限制——可以转化为,对于任意一棵子树,任意一个限制中,或者没有一个编号在其中,或者只有在其中,或者均在其中。

根据这个,可以判断一个状态是否合法。接着,只要在过程中,只考虑合法的,就能得到满足前缀限制的标号方案数了。

算法一

根据以上的分析,可以得到一个暴力的做法:

保存,考虑以为根的子树中的前个儿子,在它们之中分配代表的标号集合的方案数。保存考虑前个儿子时的值。

对于第个儿子,枚举前个儿子中用去的标号集合,枚举这个儿子的子树中用去的标号集合,用更新

考虑完所有儿子之后,枚举根节点分配到的标号,用更新.或者不给根节点分配标号,用更新

过程中,需要保证所有的状态均合法。状态的合法性可以提前处理出来。这样,总复杂度就是是合并儿子时子集枚举的复杂度。

算法二

由于状态的合法性可以预处理出来,时可以只枚举合法的状态。

可以证明合法的状态不超过个。这是因为,对于一个限制,它在状态中只有三种合法的存在情况。这样,总的状态数就从降到了

接下来,只要预处理出所有合法状态的合法子集,满足均为合法状态,就可以用的时间完成.

预处理时只要直接枚举子集判断即可,接下来证明这样做了之后,合法子集的总个数是级别的。

由于均合法,对于每一对限制,它们在中的合法存在情况只有以下种:

  • 均在
  • 均在
  • 均不在
  • 仅有
  • 仅有

所以这样的组合的总个数只有级别。时,直接枚举这样的合法组合进行转移。总的复杂度就是了。

参考资料

SRM599 - TopCoder Wiki

results matching ""

    No results matching ""