Description

DFA(确定性有限状态自动机)是一个有向图,顶点称为状态,边称为转移。每个转移用一个字母标记。对于每个状态s和每个转移l,至多有一个转移从s出发且标记为l。DFA有一个初始状态和若干个结束状态。DFA定义的语言的单词可以由从开始状态到结束状态的路径上所有的字母连接起来。
图中表示一个语言(包括单词:fix,foo,ox)的DFA。第一个DFA有7个状态,它不是最优的。第二个DFA定义的是同一个语言,但只有5个状态。
给定一个语言,包含有限个单词,求出定义该语言的DFA得最少状态数。

Input

    第一行有一个整数n(1<=n<=5000),表示语言的单词数。接下来n行,每行一个单词。每个单词由1到30个小写字母组成。输入的所有单词互不相同。

Output

    一个数,定义该语言的DFA得最少状态数。
等价的状态可以合并,两个状态等价当且仅当同时(不)为结束状态且出边及对应的状态相同
一开始建棵trie然后从叶节点开始将等价状态缩点
#include<cstdio>
#include<algorithm>
typedef unsigned long long u64;
const int N=;
int n,ans=;
int nx[N][],id[N],pv[N],e[N],p=;
char s[];
bool ed[N];
int q[N],qp=,q1[N];
u64 h[N];
bool cmp(int a,int b){return h[a]<h[b];}
u64 hash(int w){
u64 v=;
for(int i=;i<;i++)v=v*+id[nx[w][i]];
if(e[w])v+=;
return v;
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%s",s);
int w=;
for(int i=;s[i];i++){
int c=s[i]-'a';
if(!nx[w][c])nx[w][c]=++p;
pv[nx[w][c]]=w;
w=nx[w][c];
}
e[w]=;
}
for(int i=;i<=p;i++)id[i]=i;
for(int i=;i<=p;i++)if(e[i]){
bool is=;
for(int j=;j<;j++)if(nx[i][j]){is=;break;}
if(is)ed[q[qp++]=i]=;
}
while(qp){
int m=qp;
qp=;
for(int i=;i<m;i++)h[q1[i]=q[i]]=hash(q[i]);
std::sort(q1,q1+m,cmp);
for(int i=,j=;i<m;i=j){
while(h[q1[i]]==h[q1[j]])id[q1[j++]]=q1[i];
if(i+<j)for(int k=i;k<j;k++)if(!ed[pv[q1[k]]])ed[q[qp++]=pv[q1[k]]]=;
}
}
for(int i=;i<=p;i++)if(id[i]==i)++ans;
printf("%d",ans);
return ;
}

bzoj2537: [neerc2007]Language Recognition的更多相关文章

  1. 如何将 Cortana 与 Windows Phone 8.1 应用集成 ( Voice command - Natural language recognition )

    随着 Windows Phone 8.1 GDR1 + Cortana 中文版的发布,相信有很多用户或开发者都在调戏 Windows Phone 的语音私人助理 Cortana 吧,在世界杯的时候我亲 ...

  2. 论文笔记《Tracking Using Dynamic Programming for Appearance-Based Sign Language Recognition》

    一.概述 这是我在做手势识别的时候,在解决手势画面提取的时候看的一篇paper,这里关键是使用了动态规划来作为跟踪算法,效果是可以比拟cameshift和kf的,但在occlusion,gaps或者离 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. hive

    Hive Documentation https://cwiki.apache.org/confluence/display/Hive/Home 2016-12-22  14:52:41 ANTLR  ...

  5. java开发常用jar包介绍(转载)

    jta.jar 标准JTA API必要 commons-collections.jar 集合类 必要 antlr.jar  ANother Tool for Language Recognition ...

  6. SSH框架整合配置所需JAR包(SSH整合)

    转载于:http://www.cnblogs.com/kaige123/p/5719662.html Hibernate Jar: 1.hibernate3.jar,这个是hibernate3.0的核 ...

  7. J2EE相关总结

    Java Commons The Java™ Tutorials: http://docs.oracle.com/javase/tutorial/index.html Java Platform, E ...

  8. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  9. Spring入门学习(一)

    SpringMVC基础平台补充(2016.03.03) 如果想要开发SpringMVC,那么前期依次安装好:JDK(jdk-8u74-windows-x64,安装后配置环境变量JAVA_HOME和CL ...

随机推荐

  1. 开机流程与主引导分区(MBR)——鸟哥私房菜

    在前篇随笔中,已经谈到了CMOS与BIOS,CMOS是记录各项硬件参数(包括系统时间.设备的I/O地址.CPU的电压和频率等)且嵌入到主板上面的存储器,BIOS是一个写入到主板上的韧体(韧体是写入到硬 ...

  2. 如何让Android字体自适应屏幕分辨率

    在不同的分辨率下,Android字体大小怎么自适应分辨率的变化? 假设需要适应320x240,480x320分辨率.在res目录下新建文件夹values-320x240, values-480x320 ...

  3. ZOJ 1002 Fire Net

    题目大意:有一个4*4的城市,其中一些格子有墙(X表示墙),在剩余的区域放置碉堡.子弹不能穿透墙壁.问最多可以放置几个碉堡,保证它们不会相互误伤. 解法:从左上的顶点开始遍历,如果这个点不是墙,做深度 ...

  4. map遍历的四种方法

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  5. leetcode 148. Sort List ----- java

    Sort a linked list in O(n log n) time using constant space complexity. 排序,要求是O(nlog(n))的时间复杂度和常数的空间复 ...

  6. MySQL备份的shell脚本

    经过测试该脚本可以远程备份,但需要配置远程登录用户的权限,经过测试啊,在把这个脚本添加到计划任务的时候是无法识别mysql命令的(即使是将mysql添加到环境变量也无法识别,是因为/etc/cront ...

  7. DAG上的动态规划之嵌套矩形

    题意描述:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽, 矩形(a,b)可以嵌套在矩形(c,d)当且仅当a<c且b<d, 要求选出尽量多的矩形排成一排,使得除了最后一个外, ...

  8. 《Java程序设计》第二次实验报告

    20145220 <Java程序设计>第二次实验报告 课程:Java程序设计 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 实验内容 初步掌握单元测 ...

  9. CentOS 中PHP开启 GD功能

    yum install php-gd 然后重启服务器: service httpd restart

  10. C++@命名空间(转)

    转自http://hi.baidu.com/rainysky_2006/blog/item/a490e01fc3de7964f724e4d1.html 本讲基本要求 * 掌握:命名空间的作用及定义:如 ...