SimilarNames
作者 : 翁伊嘉
关键词 : 状压, 状态优化
题目概述
输入个字符串,现在需要给它们从到标号,满足条形如 标号为的字符串是标号为的字符串的前缀 的限制。求标号方案数,模输出。
,字符串长度
分析
考虑到前缀限制,容易想到先将给定字符串之间的前缀关系处理出来。添加一个空串为根,所有串之间的前缀关系构成了一个树的结构。
令有特殊限制的字符串总个数为,确定了这个字符串是哪些字符串后,剩下的字符串可以任意地给予编号,只要最后给答案乘上即可。
注意到题中的,也就是不超过个,于是可以在树上进行状压。用表示在以为根的子树中选出个字符串,对应到所代表的标号集合的方案数。
考虑前缀限制,一个分配标号方案是合法的,当且仅当对于每一对限制,在前缀树上是的祖先。由于我们的是以子树为状态的,考虑进一步转化这个限制——可以转化为,对于任意一棵子树,任意一个限制中,或者没有一个编号在其中,或者只有在其中,或者均在其中。
根据这个,可以判断一个状态是否合法。接着,只要在过程中,只考虑合法的,就能得到满足前缀限制的标号方案数了。
算法一
根据以上的分析,可以得到一个暴力的做法:
用保存,考虑以为根的子树中的前个儿子,在它们之中分配代表的标号集合的方案数。保存考虑前个儿子时的值。
对于第个儿子,枚举前个儿子中用去的标号集合,枚举这个儿子的子树中用去的标号集合,用更新
考虑完所有儿子之后,枚举根节点分配到的标号,用更新.或者不给根节点分配标号,用更新
过程中,需要保证所有的状态均合法。状态的合法性可以提前处理出来。这样,总复杂度就是。是合并儿子时子集枚举的复杂度。
算法二
由于状态的合法性可以预处理出来,时可以只枚举合法的状态。
可以证明合法的状态不超过个。这是因为,对于一个限制,它在状态中只有三种合法的存在情况。这样,总的状态数就从降到了
接下来,只要预处理出所有合法状态的合法子集,满足与均为合法状态,就可以用的时间完成.
预处理时只要直接枚举子集判断即可,接下来证明这样做了之后,合法子集的总个数是级别的。
由于均合法,对于每一对限制,它们在与中的合法存在情况只有以下种:
- 均在中
- 均在中
- 均不在中
- 仅有在中
- 仅有在中
所以这样的组合的总个数只有级别。时,直接枚举这样的合法组合进行转移。总的复杂度就是了。