有点晚了我就不调试了..不过说是这么说我还是过了编译的..

#include<bits/stdc++.h>
using namespace std;
namespace DFA{
const int alp=10;
struct Node{int t[alp],a;Node(){}Node(int tx,int ac):a(ac){for(int i=0;i<alp;++i)t[i]=tx;}};
struct DFA{
vector<Node>nodes;
int starting;
int crt(int ac=0){nodes.emplace_back(nodes.size(),ac);}
void ss(int s){starting=s;}
void st(int s,int c,int t){nodes[s].t[c]=t;}
void sa(int s,int a){nodes[s].a=a;}
};
int _C_u_dd(vector<int>&a,const DFA&tt,int pos,int up){
a[pos]=up++;
const Node&g=tt.nodes[pos];
for(int i=0;i<alp;++i)if(!a[g.t[i]])
up=_C_u_dd(a,tt,g.t[i],up);
return up;
}
int Cut_unreachable(DFA&cc,const DFA&tt){
cc.nodes.clear();
vector<int>z;
z.resize(tt.nodes.size());
int gr=_C_u_dd(z,tt,tt.starting,1);
cc.nodes.resize(gr);
for(int i=0,_=tt.nodes.size();i<_;++i)if(z[i]){
const Node&p=tt.nodes[i];
Node&q=cc.nodes[z[i]];
q.a=p.a;
for(int i=0;i<alp;++i)
q.t[i]=z[p.t[i]];
}cc.ss(1);
return gr-1;
}
namespace PRS{
struct q{
vector<int>son;int tid,in;
q(int sz=0):tid(-1){if(sz)son.resize(sz);}
};
typedef pair<int,int>o;
struct p{
vector<q>z;
vector<o>b;
p(int t){
z.emplace_back(t);
b.resize(t+1);
for(int i=0;i<t;++i)
b[i+1]=o(0,i),z[0].son[i]=i+1;
}
void _reassign(q&a,int s){
q&t=z[a.tid];
int id=a.son[s];
if(s!=a.son.size()-1){
int idr=a.son[a.son.size()-1];
b[idr].second=s;
swap(a.son[s],a.son[a.son.size()-1]);
}a.son.pop_back();
b[id]=o(a.tid,t.son.size());
t.son.push_back(id);
}
vector<o>split(vector<int>t){
vector<o>q;
for(int v:t){
if(z[b[v].first].tid==-1){
q.emplace_back(b[v].first,z.size());
z[b[v].first].tid=z.size(),z.emplace_back();
}_reassign(z[b[v].first],b[v].second);
}for(o g:q)
z[g.first].tid=-1;
return q;
}
};
}
typedef vector<int> inlist[alp];
void DFA_Minimize(DFA&tt){
DFA gg;
int si=Cut_unreachable(gg,tt);
PRS::p pr(si);
vector<int>vi;
inlist*inl=new inlist[si+1];
for(int i=1;i<=si;++i){
for(int j=0;j<alp;++j)
inl[gg.nodes[i].t[j]][j].push_back(i);
if(gg.nodes[i].a)
vi.push_back(i);
}auto gd=pr.split(vi)[0];
stack<int>sets;
sets.push(gd.second);
pr.z[gd.second].in=1;
while(!sets.empty()){
int setNow=sets.top();sets.pop();
pr.z[setNow].in=0;
vector<int>qs;
for(int i:pr.z[setNow].son)
qs.push_back(i);
for(int j=0;j<alp;++j){
vi.clear();
for(int i:qs)
for(int k:inl[i][j])
vi.push_back(k);
auto qt=pr.split(vi);
for(auto i:qt)
if(pr.z[i.first ].son.size()&&
pr.z[i.second].son.size())
if(pr.z[i.first ].in||
pr.z[i.first ].son.size()>
pr.z[i.second].son.size())
sets.push(i.second),pr.z[i.second].in=1;
else sets.push(i.first),pr.z[i.first].in=1;
}
}int id=1;
for(auto i:pr.z)if(i.son.size())
i.in=id++;
tt.nodes.resize(id);
for(auto i:pr.z)if(i.son.size()){
Node&q=tt.nodes[i.in];
Node&u=gg.nodes[i.son[0]];
for(int j=0;j<alp;++j)
q.t[j]=pr.z[pr.b[u.t[j]].first].in;
}tt.starting=pr.z[pr.b[1].first].in;
delete[]inl;
}
}
int main(){
return 0;
}

最后祝您身体健康,再见.

DFA Minimization的更多相关文章

  1. 基于DFA敏感词查询的算法简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直 ...

  2. java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  3. 使用DFA做文本编辑器的自动提示

    之前看龙书的时候,龙书提到可以在编译器里用动态的生成的NFA自动机来动态匹配自己的输入串,NFA的简单实现其实写起来非常简单,但是我是实际凭感觉写完之后,却觉得并不是非常的好用,在处理自己已经输入过的 ...

  4. DFA 最小化

    NDFA.εNDFA 确定化的细节这里就不总结了,这里说一说DFA最小化的算法. 关于DFA最小化,

  5. C# 词法分析器(五)转换 DFA

    系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 在上一篇文章中,已经得到了与正则表达式等价的 NFA ...

  6. NFA转DFA - json数字识别

    json的主页上,提供了number类型的符号识别过程,如下: 图片引用:http://www.json.org/json-zh.html 实际上这张图片表示的是一个状态机,只是状态没有标出来.因为这 ...

  7. DFA敏感词过滤

    import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.ArrayList; ...

  8. 求子串-KPM模式匹配-NFA/DFA

    求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subStrin ...

  9. 编译系统中的 NFA/DFA算法理解

    1.问题概述 NFA 和 DFA浅析---要深入了解正则表达式,必须首先理解有穷自动机. 有穷自动机(Finite Automate)是用来模拟实物系统的数学模型,它包括如下五个部分: 有穷状态集St ...

随机推荐

  1. unsigned __int64 打印方法

    原文出处 long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647. 而unsigned范围是[0,2^32),即0~4294967295.也就是说,常规的 ...

  2. CUDA并行存储模型

    CUDA将CPU作为主机(Host),GPU作为设备(Device).一个系统中可以有一个主机和多个设备.CPU负责逻辑性强的事务处理和串行计算,GPU专注于执行高度线程化的并行处理任务.它们拥有相互 ...

  3. 《GPU高性能编程CUDA实战中文》中第四章的julia实验

    在整个过程中出现了各种问题,我先将我调试好的真个项目打包,提供下载. /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. ...

  4. 查询Linux下已安装软件的版本

    #rpm -qa | grep mysql

  5. Incorrect key file for table './xx_db/xx_table.MYI'; try to repair it

    解决办法: 可以先运行 CHECK TABLE 表名 检查下是否存在错误. 然后运行 REPAIR TABLE 表名 进行修复.

  6. sigqueue与kill详解及实例

    /*********************************************************************************************** 相关函 ...

  7. 三十二、MySQL 导出数据

    MySQL 导出数据 MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上. 使用 SELECT ... INTO OUTFILE 语句导出数据 以下实例中 ...

  8. CentOS6 x86_64最小化安装优化脚本

    #!/bin/bash #centos6. x86_64系统最小化安装优化脚本 #系统基础优化,建议以root运行 if [ $USER != "root" ];then echo ...

  9. 用dump为什么总会在前面出现/path/debug.php:193

    解决方案,在php.ini中的xdebug中加一行代码:xdebug.overload_var_dump=1

  10. A计划 hdu2102(BFS)

    A计划 hdu2102 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国 ...