当前位置: 首页 > news >正文

【学习笔记】DFA的构造

虽然平时做过但是考场上肯定还是不会,不过没事干还是写一下吧

Myhill-Nerode\text{Myhill-Nerode}Myhill-Nerode 定理:给定一个语言LLL,定义在字符串上一个关系为,若对于所有的zzzxzxzxzLLL中当且仅当yzyzyzLLL中,则称x,yx,yx,y在同一个等价类中。因此它把所有有限字符串的集合划分成一个或多个等价类。

Myhill-Nerode\text{Myhill-Nerode}Myhill-Nerode 定理声称在LLL的最小自动机中状态的数目等价于在LLL中诱导出的等价类的数目。

容易发现,语言LLL可以被有限状态机接受,当且仅当等价类的数目是有限的。

Gym 102586J

考虑用等价类构造DFADFADFA,还要为每一类找一个代表元。这里必须指出的是,LLL中的字符串一定在同一个等价类中,这个等价类也是接收点。

这里假定有限字符串集合长度不超过LLL,然后暴搜求出每个字符串的等价类即可。

如何证明取L=10L=10L=10的正确性?思维小实验

假设存在一个DFADFADFA d(k)d(k)d(k)能正确识别长度不超过kkk的好串,据此可以构造出一个NFANFANFA能正确识别长度不超过k+2k+2k+2的好串(其构造方法是,在原DFADFADFA的基础上建立ϵ\epsilonϵ,然后建一个子DFADFADFA表示操作的长度为333的段,再用ϵ\epsilonϵ连回在原DFADFADFA中所对应的字符边即可),再将其转化为DFADFADFA 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)=\cdotsd(k)=d(k+2)=d(k+4)= ,这也就是我们所要求的DFADFADFA。验证即可。

CF956F

考虑构造一个FAFAFA来识别不超过nnn位的f(m)≤kf(m)\le kf(m)k的数字串

FAFAFA的状态是背包容量,字母表是0∼90\sim 909,原来状态是ccc,读入一个数字ddd,可以转移到c+dc+dc+d∣c−d∣|c-d|cd,显然这是一个NFANFANFA,可以设置状态数为100100100,然后大力幂集转移。

可以用长度为100100100bitset\text{bitset}bitset实现幂集,用一个哈希表记录某个bitset\text{bitset}bitset出现过没有。

理论复杂度O(2100)O(2^{100})O(2100)。这非常不科学。这种方法还是比较大胆的。

我完全没这个魄力好吧

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N=1e5+5;
int n,K,tot,to[N][10],c[100],len;
ll l,r,dp[N][20][10];
map<__int128,int>id;
__int128 has(bitset<100>&b){__int128 x=0;for(int i=99;i>=0;i--){x*=2;if(b[i])x++;}return x;
}
int dfs(bitset<100>&b){int x;if(id[has(b)])return id[has(b)];x=id[has(b)]=++tot;for(int i=0;i<10;i++){if(b._Find_first()<=i)dp[tot][0][i]=1;}for(int i=0;i<10;i++){bitset<100>b2=(b<<i)|(b>>i);for(int j=0;j<i;j++)if(b[j])b2[i-j]=1;to[x][i]=dfs(b2);}return x;
}
ll dfs2(int x,int y,int z){if(!z)return dp[y][x][K];if(x==0)return dp[y][0][K];ll res=0;for(int i=0;i<=c[x];i++){res+=dfs2(x-1,to[y][i],i==c[x]);}return res;
}
ll solve(ll x){len=0;while(x)c[++len]=x%10,x/=10;return dfs2(len,1,1);
}
int main(){bitset<100>e;e[0]=1;int T;cin>>T,dfs(e);for(int l=0;l<10;l++){for(int i=1;i<=18;i++){for(int j=1;j<=tot;j++){for(int k=0;k<10;k++){dp[j][i][l]+=dp[to[j][k]][i-1][l];}}} }while(T--){cin>>l>>r>>K;cout<<solve(r)-solve(l-1)<<"\n";}
} 
http://www.lryc.cn/news/9136.html

相关文章:

  • MyBatis 之二(增、删、改操作)
  • 28k入职腾讯测试岗那天,我哭了,这5个月付出的一切总算没有白费~
  • 【surfaceflinger源码分析】surfaceflinger进程的消息驱动模型
  • 「架构师」001计算机组成与体系结构
  • 既然有HTTP协议,为什么还要有RPC
  • 【新2023】华为OD机试 - 选座位(Python)
  • 数据分析与SAS学习笔记4
  • Xepor:一款针对逆向工程和安全分析的Web路由框架
  • Hadoop核心组成和生态系统简介
  • Flutter-Charts_painter大数据量绘制性能优化-数据收敛
  • 使用 GeForce Experience 更新 NVIDIA GPU 显卡驱动
  • Java泛型的<? super T>,<? extend T>的区别
  • 如何做出好看的Excel可视化图表?
  • 智能吸吹一体式方案设计特点
  • CSDN 编辑器 Marddown 语法备忘
  • 回归预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络多输入单输出回归预测
  • Linux——操作系统安装
  • AFLNET lightftp项目报错解决方法
  • av 146 003
  • 干了1年“点点点”,自己辞职了,下一步是继续干测试还是转开发?
  • 国产技术迎来突破,14nm芯片横空出世,低代码也有好消息
  • 使用clickhouse-backup工具备份clickhouse数据库
  • python cartopy绘制扇形区域图/cartopy绘制北极部分区域
  • 如何设置股票接口版交易软件的指标涨跌家数?
  • C++之lambda函数(匿名函数)
  • WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第四步-模块的功能注释)
  • 如何看待年轻人躺平式生活观?
  • JS 设计模式 - 怎么让你的代码提示一个档次
  • 遮挡贴图(Occlusion Map)和微表面贴图(Microsurface Map)
  • 【Vue】基本交互指令