湖大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 ...
随机推荐
- [Cocos2D-x For WP8]ParallaxNode视差
视差就是从有一定距离的两个点上观察同一个目标所产生的方向差异.从目标看两个点之间的夹角,叫做这两个点的视差角,两点之间的距离称作基线.只要知道视差角度和基线长度,就可以计算出目标和观测者之间的距离.游 ...
- BZOJ 1008 题解
1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7845 Solved: 3359[Submit][Status] ...
- CF 22B. Bargaining Table
水题.好久没有写过优化搜索题了. #include <cstdio> #include <cstring> #include <iostream> #include ...
- POJ 1279 Art Gallery(半平面交)
题目链接 回忆了一下,半平面交,整理了一下模版. #include <cstdio> #include <cstring> #include <string> #i ...
- URAL 1303. Minimal Coverage(DP)
题目链接 又是输出路径...这题完全受上题影响,感觉两个题差不多..用了基本上一样的算法写了,这题比较纠结,就是卡内存啊...5000*5000的数组开不了..然后没办法,水了好几次MLE,看了一下虎 ...
- 【CodeVS】p1038 一元三次方程求解
题目描述 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100 ...
- marquee滚动语法
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- CAS单点登录中文用户名乱码问题
CAS单点登录中文用户名乱码问题,有两种情况 1. CAS server乱码 即在向server端提交用户名和密码时,发生了乱码,解决方法是: 打开WEB-INF/web.xml,在其它的Filter ...
- PLSQL Developer注册码
Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...