【学习笔记】DFA的构造
虽然平时做过但是考场上肯定还是不会,不过没事干还是写一下吧
Myhill-Nerode \text{Myhill-Nerode} Myhill-Nerode 定理:给定一个语言 L L L,定义在字符串上一个关系为,若对于所有的 z z z, x z xz xz在 L L L中当且仅当 y z yz yz在 L L L中,则称 x , y x,y x,y在同一个等价类中。因此它把所有有限字符串的集合划分成一个或多个等价类。
Myhill-Nerode \text{Myhill-Nerode} Myhill-Nerode 定理声称在 L L L的最小自动机中状态的数目等价于在 L L L中诱导出的等价类的数目。
容易发现,语言 L L L可以被有限状态机接受,当且仅当等价类的数目是有限的。
Gym 102586J
考虑用等价类构造 D F A DFA DFA,还要为每一类找一个代表元。这里必须指出的是, L L L中的字符串一定在同一个等价类中,这个等价类也是接收点。
这里假定有限字符串集合长度不超过 L L L,然后暴搜求出每个字符串的等价类即可。
如何证明取
L
=
10
L=10
L=10的正确性?思维小实验
假设存在一个 D F A DFA DFA d ( k ) d(k) d(k)能正确识别长度不超过 k k k的好串,据此可以构造出一个 N F A NFA NFA能正确识别长度不超过 k + 2 k+2 k+2的好串(其构造方法是,在原 D F A DFA DFA的基础上建立 ϵ \epsilon ϵ,然后建一个子 D F A DFA DFA表示操作的长度为 3 3 3的段,再用 ϵ \epsilon ϵ连回在原 D F A DFA DFA中所对应的字符边即可),再将其转化为 D F A DFA DFA d ( k + 2 ) d(k+2) d(k+2)(最常用的方法是幂极构造),并最小化。
如果 d ( k ) d(k) d(k)等价于 d ( k + 2 ) d(k+2) d(k+2),我们就能得到 d ( k ) = d ( k + 2 ) = d ( k + 4 ) = ⋯ d(k)=d(k+2)=d(k+4)=\cdots d(k)=d(k+2)=d(k+4)=⋯ ,这也就是我们所要求的 D F A DFA DFA。验证即可。
CF956F
考虑构造一个 F A FA FA来识别不超过 n n n位的 f ( m ) ≤ k f(m)\le k f(m)≤k的数字串
F A FA FA的状态是背包容量,字母表是 0 ∼ 9 0\sim 9 0∼9,原来状态是 c c c,读入一个数字 d d d,可以转移到 c + d c+d c+d和 ∣ c − d ∣ |c-d| ∣c−d∣,显然这是一个 N F A NFA NFA,可以设置状态数为 100 100 100,然后大力幂集转移。
可以用长度为 100 100 100的 bitset \text{bitset} bitset实现幂集,用一个哈希表记录某个 bitset \text{bitset} bitset出现过没有。
理论复杂度 O ( 2 100 ) O(2^{100}) O(2100)。这非常不科学。这种方法还是比较大胆的。
我完全没这个魄力好吧
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530030.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」