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: ...
随机推荐
- Android之官方下拉刷新控件SwipeRefreshLayout
SwipeRefreshLayout 是在V4包里面,首先要先导入V4包,最新的V4包里面才有这控件 首先是布局 <android.support.v4.widget.SwipeRefreshL ...
- Oracle 创建dblink
创建dblink语法: create database link link名称 connect to 对方数据库用户名 identified by 对方数据库用户密码 using '对方数据库ip: ...
- jquery change dropdownlist selected option
<select name="corporation"> <option value="1">corporation1</optio ...
- 无向图的DFS遍历(方法之一)
如果看不懂辅助解释在后面第点 1.录入方式: 输入 u - v 表示一边的2个端点 2.存储结构 struct edge { int from; int to; int next; } e[MAXN ...
- VS使用过程中,编写JS没有智能提示解决方法
问题:编写基本Script代码没有问题,但是在编写DOM代码时候没有智能提示.也就是在编写一般javascript代码时候没有问题,但是要写DOM代码的时候发现没有智能提示,如document等都需要 ...
- zstuoj 4243 牛吃草 ——(二分+两圆交)
这题上次补了以后忘记写博客了,现在补一下. 有两个注意点,第一是两圆相交的模板.可以通过任意一种情况手推出来. 第二是,实数二分要注意不用ans记录为妙,因为可能因为eps过小,导致ans无法进入记录 ...
- (转)不停止Nginx服务的情况下平滑变更Nginx配置
在不停止Nginx服务的情况下平滑变更Nginx配置 1.修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确: /u ...
- tesseract配置过程
tesseract配置过程: 1. 为了避免配置环境变量,可以先下载一个 tesseract-ocr-setup-3.02.02.exe(tesseract配置文件夹里有),然后安装(假设安装目录为D ...
- 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...
- SQL语句中=null和is null
平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...