题目
官网链接:蓝桥杯官网
UVALive链接:UVALive
大意是:已知密码由26个小写字母组成,知道一个密码的m个子串,和密码的长度,求密码有多少种可能如果可能数小于等于42,则输出所有密码
参考
先给出参考的文章:lab104_yifan的博客
实际上百度出来的Password Suspects都是UVA 1076题,反而让我好奇的是UVA是什么,后来才知道是OJ(Online Judge)也就是在线的判题系统
在此也记录另一个博主的文章:OJ的推荐
思路
蓝桥官网也给出了,需要用AC自动机和DP算法,然而我并没有学过自动机这个东西,只能百度学习然后慢慢研究参考的代码的含义了。
这个算法的核心除了AC自动机之外,有是DP(动态规划)、状态压缩以及深度优先搜索,实际就是dfs函数,dp矩阵是三维矩阵,这个矩阵每一维度的含义需要深刻理解:
d[u][len][state]表示当前递归到了这样一个状态:
1.当前密码串已经确定的长度是len
2.用字典树对已确定的密码串进行匹配,到当前状态时,字典树匹配到的结点是u
3.如果state的二进制数是00001010B,假设密码子串有5个,则表示当前状态已经出现的密码子串有按输入顺序的第2、4个。
这里实际是一个状态压缩,将所有密码的可能压缩