蓝桥杯 Java Password Suspects

本文介绍了一道蓝桥杯比赛中的题目,涉及密码由26个字母组成的子串,已知部分子串和密码长度。解题思路包括使用AC自动机和动态规划(DP)算法。由于作者未学过自动机,通过学习参考代码理解算法,其中DP矩阵为三维,用于记录密码串长度、字典树节点位置和已出现子串状态。在Java实现中,注意LinkedList的线程不安全问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

官网链接:蓝桥杯官网
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的二进制数是0000

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值