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: ...
随机推荐
- solr清空全部索引
http://blog.csdn.net/qing419925094/article/details/42142117
- calculator
#include <stdio.h> #include <stdlib.h> typedef enum { FALSE = , TRUE }BOOL; void calcula ...
- redis的安装和启动
Windows下Redis的安装及PHP扩展使用 时间 2014-10-28 17:47:09 CSDN博客 原文 http://blog.csdn.net/wyqwclsn/article/de ...
- iOS开发app启动原理及视图和控制器的函数调用顺序
main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...
- web之css伪类
利用伪类清楚浮动: 代码: <!DOCTYPE html> <htmllang="en"> <head> <metacharset=&qu ...
- error-2016-2-15
错误:该请求包含双重转义序列,而 Web 服务器上配置的请求筛选拒绝双重转义序列原因:一些URL中可能会包含+号等符号,然后IIS7以上的版本会默认拒绝请求此URL,需要进行如下的修改. 解决PHP中 ...
- Angularjs学习笔记(一)
大部分传统的模板系统,对模板的渲染是个线性单向的过程:模板或变量与模板混合在一起产生结果的标记集合.任何对模型的改变都需要通过模板的重新计算.但AngularJS有所不同,任何用户引发的视图的改变,都 ...
- C# 模拟键盘操作--SendKey(),SendKeys()
模拟键盘输入就是使用以下2个语法实现的.SendKeys.Send(string keys); //模拟汉字(文本)输入SendKeys.SendWait(string keys); //模拟按键输 ...
- linux命令(2):cd命令
Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1. ...
- HDU1054 Strategic Game——匈牙利算法
Strategic Game Bob enjoys playing computer games, especially strategic games, but sometimes he canno ...