HDU2471_History of Languages
有意思的题目,给出两个自动机,判断这个两个自动机是否是等价的?
两个自动机是等价的,那么他们可接受的字符串集合一定是完全一样的。
于是我们可以从(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的更多相关文章
- PLoP(Pattern Languages of Programs,程序设计的模式语言)
2014/8/1 12:24:21潘加宇 http://www.umlchina.com/News/Content/340.htmPloP大会2014即将举行 PLoP(Pattern Languag ...
- 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 ...
- ECSHOP \admin\edit_languages.php GETSHELL Based On Injection PHP Code Into /languages/zh_cn/user.php
目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于很多CMS网站来说,它们都需要保存很多的网站META信息,最常用的最佳实践是以 ...
- UVALive 6523 Languages
传送门 The Enterprise has encountered a planet that at one point had been inhabited. The only remnant f ...
- Scripting Languages
Computer Science An Overview _J. Glenn Brookshear _11th Edition A subset of the imperative programmi ...
- 1.6.7 Detecting Languages During Indexing
1. Detecting Languages During Indexing 在索引的时候,solr可以使用langid UpdateRequestProcessor来识别语言,然后映射文本到特定语言 ...
- The future of programming languages
In this video from JAOO Aarhus 2008 Anders Hejlsberg takes a look at the future of programming langu ...
- Languages
Languages A language class exists inside the system/Core folder, this class have 2 methods: load - L ...
- BZOJ3296: [USACO2011 Open] Learning Languages
3296: [USACO2011 Open] Learning Languages Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 81 Solved: ...
随机推荐
- js计时事件
通过在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行,我们称之为计时事件. 1. setTimeout()--暂停指定的时间后执行指定的代码 clearTimeout ()--停止se ...
- Google V8编程详解(三)Handle & HandleScope
上一章简单的演示了一个Helloworld Demo.里面涉及到了V8的一些基本类型和概念,本章将围绕这个Demo对V8的基本类型和相关概念进行讲解. 这里还是先把Demo贴出来便于后面分析: #in ...
- ubuntu使用 服务
在这里写了很多篇linux,习惯了在这里写 centos中定时任务命令是crond ubuntu中定时任务命令是cron 这两种linux系统不一样的地方还是挺多的, 既然我目前的专注点是ubuntu ...
- 修改C# 新建类模板
找到安装路径下的这个文件夹:D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSh ...
- java打包成jar,但不打包配置文件
有时候我们做java project的时候,都会打包成jar程序,为了方便部署会加个配置文件conf/pro.properties(conf文件夹与src文件夹同级) 但是不想打包进jar.其实用ec ...
- the server quit without updating pid file (/var/lib/mysql/localhost.localdomain.pid)
前几天装的mysql,用的还挺爽的,第二天再用就不行了,报的错误如标题.网上也是众说纷纭,可能有很多原因会导致这种错误吧.我用的是将Mysqld这个进程杀掉,就可以启动mysql了
- Mybatis之关联查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- NTKO控件在阅读PDF时,显示DEMO的问题
NTKO控件在阅读PDF时,显示DEMO的问题, 原因是加载了以前的DEMO版本的控件.解决办法是: 在命令行中执行命令: regsvr32 /u NtkoOleDocAll.DLL 卸载老版本的控件 ...
- app进入后台之后接收到通知,点进去进入新的页面,再次进入后台,再点击通知进入页面(,两次通过通知进入的页面,创建了两次,会多一个页面,)解决办法监听
在点击通知进入的页面的 //UIApplicationWillResignActiveNotification是app即将进入后台的方法 //增加监听使它在进入后台之前pop上一个页面 - (void ...
- 第四章 ngrok使用
网址(下载):http://www.ngrok.cc/ 注册:http://www.ngrok.cc/login 管理后台:http://www.ngrok.cc/user.html 创建隧道,产生隧 ...