题意:
给n个单词,要你构造长度为k的密文,使得密文解密后是由这n个单词构成的
解密书,有k页,一开始在第1页,每页26行。第i行一个字符a和一个数字b表示密文i解码后变成a,并翻到第b页
并且构造的密文中的子串不能出现给出的单词。
问k=1,2,3…m时候的方案数
n <= 50, 单词总长度 <= 50, m <= 2000
给出的单词不会出现重复,也不会有一个是另一个的前缀。单词可以重复在明文中出现。
解题思路:
看一下限制条件:
- 长度要为k
- 密文中不可以出现任何子串为某个单词
- 明文是由给出的单词构成
- 密码书翻到的页数不同,密文对应的明文不同
对于第二个限制,相当于建立一棵AC自动机之后,拿密文在AC自动机上跑,不会跑到某个后缀为给出的单词的结点上去。
对于第三个限制,相当于用解密出来的明文在字典树上跑,每次跑的都是字典树上存在的边,并且走到某个单词的结尾就跳回根,最终停留在根上。
看到单词总长度<=50,意味着建树之后结点数不会超过50,所以用:
d p ( i , j , k , l ) dp(i,j,k,l) dp(i,j,k