有意思的题目,给出两个自动机,判断这个两个自动机是否是等价的?

两个自动机是等价的,那么他们可接受的字符串集合一定是完全一样的。

于是我们可以从(0,0)开始bfs,每次看看在两个自动机上走到的两个点儿子指针以及终态信息是否完全一致,是的话就把所有儿子指针都拉到队列中进行后面的判断。

由于我们对于每一个二元组,最多只需要判断一次,显然时间复杂度就不会超过n^2了。

不过我个人觉得题目好像有些问题,在题目给出的数据中,自动机可能存在一些“不合法”的状态,什么意思呢?就是说有的状态,在它的所有后继状态中没有任何一个可以到达终态,但是这种状态在构建自动机的时候应该不会被构造出来吧?题目此处让我很疑惑。

因此,我们需要从每一个终态开始沿着指针的反方向往回遍历一遍,看看那些状态是有用状态,然后bfs的时候只需要考虑有效的状态就好了。

召唤代码君:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define maxn 2020
#define pr pair<int,int>
#define mp(x,y) make_pair(x,y)
using namespace std; int next[][maxn][],tag[][maxn];
int n[],m;
bool vis[][maxn],walk[][maxn],f[maxn][maxn];
vector<int> from[][maxn]; void _init(int x)
{
for (int i=; i<n[x]; i++){
vis[x][i]=false;
walk[x][i]=false;
from[x][i].clear();
}
if (x==){
for (int i=; i<n[]; i++)
for (int j=; j<n[]; j++) f[i][j]=false;
}
} void visit(int x,int cur)
{
if (vis[x][cur]) return ;
vis[x][cur]=true;
for (unsigned i=; i<from[x][cur].size(); i++)
visit(x,from[x][cur][i]);
} bool match(int u,int v)
{
if (tag[][u]!=tag[][v]) return false;
for (int i=; i<m; i++)
if ((next[][u][i]>= && vis[][next[][u][i]])^(next[][v][i]>= && vis[][next[][v][i]])) return false;
return true;
} bool check()
{
queue<pr> Q;
Q.push(mp(,));
while (!Q.empty()){
int u=Q.front().first,v=Q.front().second;
Q.pop();
f[u][v]=true;
if (!match(u,v)) return false;
for (int i=; i<m; i++){
if (next[][u][i]> && vis[][next[][u][i]]){
if (f[next[][u][i]][next[][v][i]]) continue;
Q.push(mp(next[][u][i],next[][v][i]));
}
}
}
return true;
} int main()
{
int cas=;
while (scanf("%d",&m) && m){
for (int i=; i<; i++){
scanf("%d",&n[i]);
_init(i);
for (int j=; j<n[i]; j++){
scanf("%d",&tag[i][j]);
for (int k=; k<m; k++){
scanf("%d",&next[i][j][k]);
if (next[i][j][k]>=) from[i][next[i][j][k]].push_back(j);
}
}
for (int j=; j<n[i]; j++)
if (tag[i][j] && !vis[i][j]) visit(i,j);
}
printf("Case #%d: ",++cas);
if (check()) puts("Yes");
else puts("No");
}
return ;
}

HDU2471_History of Languages的更多相关文章

  1. PLoP(Pattern Languages of Programs,程序设计的模式语言)

    2014/8/1 12:24:21潘加宇 http://www.umlchina.com/News/Content/340.htmPloP大会2014即将举行 PLoP(Pattern Languag ...

  2. Natural language style method declaration and usages in programming languages

    More descriptive way to declare and use a method in programming languages At present, in most progra ...

  3. ECSHOP \admin\edit_languages.php GETSHELL Based On Injection PHP Code Into /languages/zh_cn/user.php

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于很多CMS网站来说,它们都需要保存很多的网站META信息,最常用的最佳实践是以 ...

  4. UVALive 6523 Languages

    传送门 The Enterprise has encountered a planet that at one point had been inhabited. The only remnant f ...

  5. Scripting Languages

    Computer Science An Overview _J. Glenn Brookshear _11th Edition A subset of the imperative programmi ...

  6. 1.6.7 Detecting Languages During Indexing

    1. Detecting Languages During Indexing 在索引的时候,solr可以使用langid UpdateRequestProcessor来识别语言,然后映射文本到特定语言 ...

  7. The future of programming languages

    In this video from JAOO Aarhus 2008 Anders Hejlsberg takes a look at the future of programming langu ...

  8. Languages

    Languages A language class exists inside the system/Core folder, this class have 2 methods: load - L ...

  9. BZOJ3296: [USACO2011 Open] Learning Languages

    3296: [USACO2011 Open] Learning Languages Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 81  Solved: ...

随机推荐

  1. php curl get

    function curlGet($url){ $ch = curl_init(); $header = "Accept-Charset: utf-8"; curl_setopt( ...

  2. 一个简单的synchronized多线程问题、梳理与思考

    一个程序,多个线程同时操作一个变量,给这个变量+1().功能很简单,可是怎么样去实现呢?这其中涉及到了哪些问题? 最基础想法 见代码: public class Test extends Thread ...

  3. js浏览器对象的属性和方法

    1.window对象 /*1.计算浏览器窗口大小*/ //不算滚动条: var width = window.innerWidth; var height = window.innerHeight; ...

  4. ios 判断相册文件图片大小的方法

    ALAssetsLibrary* alLibrary = [[ALAssetsLibrary alloc] init]; [alLibrary assetForURL:[info objectForK ...

  5. Redis从基础命令到实战之集合类型(Set)

    Redis集合类型的基础功能也是存储字符串列表,和列表类型的区别是字符串不能重复且没有顺序.当然,存储元素唯一性也可以通过应用程序保证,单从这一点上并没有体现出对比列表类型的特点. 其实,集合类型的一 ...

  6. 问题1:Mybatis 中 Signature中的参数args 问题2:MetaObject中 forObject方法中的参数

    1.@Intercepts({@Signature(type =StatementHandler.class, method = "prepare", args ={Connect ...

  7. MyBatis复习【简单配置CRUD】

    这里的案例集成了log4j的日志框架,项目架构: 用到的jar文件 添加配置文件:mybatis-config.xml  和dao层配置文件StudentDao.xml 这里书写了个简单的案例仅为了说 ...

  8. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  9. 今天研究一下SVN的分支和合并

    关键字: trunk, branch, tag, merge 以前一直以为很难,没敢接触.今天晚上看了一下,也不过如此 用起来还是很简单的

  10. tesseract3.01的训练和使用

    相关源码.资源下载:http://code.google.com/p/tesseract-ocr/downloads/list 训练步骤: 1.  Generate Training Images:生 ...