湖大OJ-实验C----NFA转换为DFA
| 实验C----NFA转换为DFA | ||||||||||||||||||||||||||||||
| Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB | ||||||||||||||||||||||||||||||
| Total submit users: 74, Accepted users: 58 | ||||||||||||||||||||||||||||||
| Problem 13120 : Special judge | ||||||||||||||||||||||||||||||
| Problem description | ||||||||||||||||||||||||||||||
| 有限状态自动机(FSM "finite state machine" 或者FSA "finite state automaton" )是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型。有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。有限状态自动机可以表示为一个有向图。有限状态自动机是自动机理论的研究对象。 定义:有限状态自动机(FA—finite automaton)是一个五元组: ? M=(Q, Σ, δ, q0, F) · 其中, ? Q——状态的非空有穷集合。?q∈Q,q称为M的一个状态。 ? Σ——输入字母表。 ? δ——状态转移函数,有时又叫作状态转换函数或者移动函数,δ:Q×Σ→Q,δ(q,a)=p。 ? q0——M的开始状态,也可叫作初始状态或启动状态。q0∈Q。 ? F——M的终止状态集合。F被Q包含。任给q∈F,q称为M的终止状态。 非确定有限状态自动机(NFA)与确定有限状态自动机(DFA)的唯一区别是它们的转移函数不同。确定有限状态自动机对每一个可能的输入只有一个状态的转移。非确定有限状态自动机对每一个可能的输入可以有多个状态转移,接受到输入时从这多个状态转移中非确定地选择一个。下图是一个非确定性有限状态自动机(NFA)的例子: ![]() 图一 一个NFA的图文表示 转移函数δ定义自下列状态转移表:
表示状态集合的子集合,采用二进制(特征)串的方式,一个子集中包含该状态,对应的特征串就为1,否则为0,比如上面状态集合的子集{q0q1q2},其特征串就是0111,而子集{q0},其特征串就是0001。将对应的特征串转换为十进制的数字,得到转移函数δ:
你的任务,是要将一个给定的NFA转换为一个完全等价的DFA(有限状态自动机等价的意思是识别相同的语言)。这里我们约定自动机识别的字符集为{0,1},初始状态集合为Q0,状态集为{q0,q1,…,qn-1}。 |
||||||||||||||||||||||||||||||
| Input | ||||||||||||||||||||||||||||||
|
输入第一行只有一个正整数t,表示有t个测试数据(意味着t个NFA)t≤10; |
||||||||||||||||||||||||||||||
| Output | ||||||||||||||||||||||||||||||
|
对于每个NFA,输出四行表示与之等价的DFA。输出格式如下: |
||||||||||||||||||||||||||||||
| Sample Input | ||||||||||||||||||||||||||||||
1 |
||||||||||||||||||||||||||||||
| Sample Output | ||||||||||||||||||||||||||||||
16 8 1 |
||||||||||||||||||||||||||||||
| Judge Tips | ||||||||||||||||||||||||||||||
| 样例中的NFA如图一所示 与某个NFA等价的DFA不一定是唯一的,比如和图一等价的DFA可以是样例的解答,也可以是如下的DFA 4 1 0 本题会使用special judge,只要是符合条件的解答都可以接受(Accept)。 |
1、算法设计思路

状态集合的子集合,采用二进制(特征)串的方式,一个子集中包含该状态,对应的特征串就为1,否则为0,比如上面状态集合的子集{q0q1q2},其特征串就是0111,而子集{q0},其特征串就是0001。将对应的特征串转换为十进制的数字,得到转移函数δ。
2、实验总结
在转化的过程中经NFA中状态矩阵中的每一个状态的集合映射到DFA中的一个状态。即NFA中的状态子集为一个DFA中的状态;只要NFA状态子集中有一个为接受态,相应的映射的DFA中的状态就为接受态
3、AC代码
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<cmath>
#define M 99999
using namespace std;
int ans[M];
int one[M];
int zero[M];
int lft[M];
int rgt[M];
int change[M];
bool vis[M];
bool ac[M]; int cnt, n, q, f;
int index(int p)
{
int x = 1;
if(p == 1)
return 0;
int i = 0;
while(++i)
{
x <<= 1;
if(p == x)
return i;
}
return 0;
}
int mege(int a, int b)
{
while(b)
{
int x = b&(-b);
if(!(a&x))
a ^= x;
b ^= x;
}
return a;
}
void dfs(int p)
{
ans[cnt] = p;
int lsum = 0, rsum = 0;
while(p)
{
int x = p&(-p);
int y = index(x);
lsum = mege(lsum, zero[y]);
rsum = mege(rsum, one[y]);
p ^= x;
}
lft[cnt] = lsum;
rgt[cnt] = rsum;
cnt++;
if(!vis[lsum])
vis[lsum] = 1, dfs(lsum);
if(!vis[rsum])
vis[rsum] = 1, dfs(rsum);
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &n, &q, &f);
for(int i = 0; i < n; i++)
scanf("%d", &zero[i]);
for(int i = 0; i < n; i++)
scanf("%d", &one[i]);
cnt = 0;
memset(vis, 0, sizeof(vis));
memset(ac, 0, sizeof(ac));
vis[q] = 1;
dfs(q);
int sum = 0;
for(int i = 0; i < cnt; i++)
if(ans[i]&f)
ac[i] = 1, sum++;
for(int i = 0; i < cnt; i++)
change[ans[i]] = i;
printf("%d %d %d\n", cnt, sum, 0);
for(int i = 0, j = 0; i < cnt; i++)
{
if(ac[i])
{
if(j)
printf(" ");
printf("%d", i);
j++;
}
}
printf("\n");
for(int i = 0; i < cnt; i++) {
if(i)
printf(" ");
printf("%d", change[lft[i]]);
}
printf("\n");
for(int i = 0; i < cnt; i++){
if(i)
printf(" ");
printf("%d", change[rgt[i]]);
}
printf("\n"); }
return 0;
}
湖大OJ-实验C----NFA转换为DFA的更多相关文章
- 湖大OJ-实验E----可判定的DFA的空问题
实验E----可判定的DFA的空问题 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Total submit ...
- NFA转换为等价的DFA
在编译系统中,词法分析阶段是整个编译系统的基础.对于单词的识别,有限自动机FA是一种十分有效的工具.有限自动机由其映射f是否为单值而分为确定的有限自动机DFA和非确定的有限自动机NFA.在非确定的有限 ...
- 利用子集构造法实现NFA到DFA的转换
概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够 ...
- NFA转DFA - json数字识别
json的主页上,提供了number类型的符号识别过程,如下: 图片引用:http://www.json.org/json-zh.html 实际上这张图片表示的是一个状态机,只是状态没有标出来.因为这 ...
- nfa转dfa,正式完成
为了加速转换的处理,我压缩了符号表.具体算法参考任何一本与编译或者自动机相关的书籍. 这里的核心问题是处理传递性闭包,transitive closure,这个我目前采取的是最简单的warshall算 ...
- 计算理论:NFA转DFA的两种方法
本文将以两种方法实现NFA转DFA,并利用C语言实现. 方法二已利用HNU OJ系统验证,方法一迷之WA,但思路应该是对的,自试方案,测试均通过. (主要是思路,AC均浮云,大概又有什么奇怪的Case ...
- 求子串-KPM模式匹配-NFA/DFA
求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subStrin ...
- 各大Oj平台介绍 刷题平台
https://leetcode.com/ http://www.cnblogs.com/lzmfywz/archive/2012/02/07/2342010.html 1.题库与网站资源题库-在线提 ...
- 各大Oj平台介绍
1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...
随机推荐
- [知识点]A*搜索(启发式搜索)
// 此博文为迁移而来,写于2015年4月4日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vwud.html 1.前言 ...
- 【noiOJ】p7940
01:查找最接近的元素 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n ...
- HDU-2084 数塔 经典dp,水
1.HDU-2084 数塔 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 3.总结:从下往上推,最后归于顶点.方程为 dp[i][j] ...
- 关于加了hibernate 框架的项目启动特别慢的问题
今天突然遇到一个问题,就是加了hibernate 框架的项目在启动的时候,特别慢,竟然达到了4分多钟,查来查去,看到我的bean类里*.hbm.xml,有这样的写法: <?xml version ...
- 常用的 DOCTYPE 声明
常用的 DOCTYPE 声明 HTML 5 <!DOCTYPE html> HTML 4.01 Strict 该 DTD 包含所有 HTML 元素和属性,但不包括展示性的和弃用的元素(比如 ...
- 用一段JS代码来比较各浏览器的极限内存与运算速度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- thinkphp关联模型的用法
HAS_ONE(值得注意的是,这是主动关联,外键必须是被关联的表): <?php namespace Home\Model; use Think\Model\RelationModel; cla ...
- WebApp 里Meta标签大全,webappmeta标签大全
1.先说说mate标签里的viewport: viewport即可视区域,对于桌面浏览器而言,viewport指的就是除去所有工具栏.状态栏.滚动条等等之后用于看网页的区域.对于传统WEB页面来说,9 ...
- linux查看主机端口进程命令
1.查看主机信息 # more /etc/hosts # Do not remove the following line, or various programs # that require ne ...
- iOS 状态栏黑色背景白色字体
一. 状态栏背景(黑色)的设置 1.在有导航栏的情况下,给导航栏设置一个像素为44的背景图片即可 [[UINavigationBar appearance] setBackgroundImage:[U ...
