HDU 5487 Difference of Languages
Difference of Languages
This problem will be judged on HDU. Original ID: 5487
64-bit integer IO format: %I64d Java class name: Main
A regular language can be represented as a deterministic finite automaton (DFA). A DFA contains a finite set of states Q and a finite set of input symbols called the alphabet Σ. Initially, the DFA is positioned at the start state q0∈Q. Given the transition function δ(q,a) and an input symbol a, the DFA transit to state δ(q,a) if its current state is q.
Let w=a1a2…an be a string over the alphabet Σ. According to the above definition, the DFA transits through the following sequence of states.
q0,q1=δ(q0,a1),q2=δ(q1,a2),…,qn=δ(qn−1,an)
The DFA also contains a set of accept states F⊆Q. If the last state qn is an accept state, we say that the DFA accepts the string w. The set of accepted strings is referred as the language that the DFA represents.
You are given two DFAs, and the languages that they represent may be different. You want to find the difference between the two languages. Specifically, you are trying to find a string that is accepted by one DFA but not accepted by the other DFA. As there could be multiple such strings, you only want the shortest one. If there are still multiple such strings, you would like the smallest one in lexicographical order.
Input
The first line of input contains a number T indicating the number of test cases (T≤200).
Each test case contains the description of two DFAs.
For the first DFA, the first line contains three integers N, M, and K, indicating the number of states, the number of rules describing the transition function, and the number of accept states (1≤K≤N≤1000,0≤M≤26N). The states are numbered from 0 to N–1. The start state is always 0.
The second line contains K integers representing the accept states. All these numbers are distinct.
Each of the next M lines consists of two states p and q, and an input symbol a, which means that the DFA transits from p to q when it receives the symbol a. You may assume that the alphabet in consideration consists of the 26 lowercase letters (a-z). It is guaranteed that, given p and a, the next state q is unique.
The description of the second DFA follows the same format as the above.
Output
For each test case, output a single line consisting of “Case #X: Y”. X is the test case number starting from 1. Y is the shortest string that is accepted by one DFA but not accepted by the other DFA. If no such string exists, output the digit “0” instead. Note that an empty string is also considered a string.
Sample Input
2
3 3 1
2
0 1 a
1 2 b
2 0 c
4 4 1
3
0 1 a
1 2 b
2 3 c
3 0 a
3 3 1
2
0 1 a
1 2 b
2 0 c
3 4 1
2
0 1 a
1 2 b
1 2 c
2 0 c
Sample Output
Case #1: ab
Case #2: ac
Source
#include <bits/stdc++.h>
#define st first
#define nd second
using namespace std;
using PII = pair<int,int>;
const int maxn = ;
struct Trie {
int son[maxn<<][],n;
bool ac[maxn<<];
void init(int n) {
memset(son,-,sizeof son);
memset(ac,false,sizeof ac);
this->n = n;
}
void add(int u,int v,char ch) {
son[u][ch - 'a'] = v;
}
} A,B;
queue<PII>q;
char str[maxn];
int d[maxn][maxn],P[maxn][maxn],cnt;
PII Pre[maxn][maxn];
bool bfs() {
while(!q.empty()) q.pop();
q.push(PII(,));
cnt += maxn;
d[][] = cnt;
while(!q.empty()) {
PII now = q.front();
q.pop();
PII x = now;
if(A.ac[now.st]^B.ac[now.nd]){
str[d[now.st][now.nd] - cnt] = ;
for(int i = ,len = d[now.st][now.nd] - cnt; i < len; ++i){
str[len - i - ] = P[x.st][x.nd] + 'a';
x = Pre[x.st][x.nd];
}
return true;
}
for(int i = ; i < ; ++i){
x.st = A.son[now.st][i] == -?A.n:A.son[now.st][i];
x.nd = B.son[now.nd][i] == -?B.n:B.son[now.nd][i];
if(d[x.st][x.nd] >= cnt) continue;
d[x.st][x.nd] = d[now.st][now.nd] + ;
Pre[x.st][x.nd] = now;
P[x.st][x.nd] = i;
q.push(x);
}
}
return false;
}
int main() {
int kase,n,m,k,u,v,cs = ;
scanf("%d",&kase);
while(kase--) {
scanf("%d%d%d",&n,&m,&k);
A.init(n);
while(k--) {
scanf("%d",&u);
A.ac[u] = true;
}
while(m--) {
scanf("%d%d%s",&u,&v,str);
A.add(u,v,str[]);
}
scanf("%d%d%d",&n,&m,&k);
B.init(n);
while(k--) {
scanf("%d",&u);
B.ac[u] = true;
}
while(m--) {
scanf("%d%d%s",&u,&v,str);
B.add(u,v,str[]);
}
if(bfs()) printf("Case #%d: %s\n",cs++,str);
else printf("Case #%d: 0\n",cs++);
}
return ;
}
HDU 5487 Difference of Languages的更多相关文章
- HDU 5487 Difference of Languages(BFS)
HDU 5487 Difference of Languages 这题从昨天下午2点开始做,到现在才AC了.感觉就是好多题都能想出来,就是写完后debug很长时间,才能AC,是不熟练的原因吗?但愿孰能 ...
- hdu 4715 Difference Between Primes
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Description All you kn ...
- HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))
Difference Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 5486 Difference of Clustering 暴力模拟
Difference of Clustering HDU - 5486 题意:有n个实体,新旧两种聚类算法,每种算法有很多聚类,在同一算法里,一个实体只属于一个聚类,然后有以下三种模式. 第一种分散, ...
- HDU 5486 Difference of Clustering 图论
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5486 题意: 给你每个元素一开始所属的集合和最后所属的集合,问有多少次集合的分离操作,并操作和不变操 ...
- hdu 4715 Difference Between Primes(素数筛选+树状数组哈希剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=4715 [code]: #include <iostream> #include <cstdio ...
- HDU 4715 Difference Between Primes (打表)
Difference Between Primes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu 4715 Difference Between Primes (打表 枚举)
Difference Between Primes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- HDU 5936 Difference(折半搜索(中途相遇法))
http://acm.hdu.edu.cn/showproblem.php?pid=5936 题意: 定义了这样一种算法,现在给出x和k的值,问有多少个y是符合条件的. 思路: y最多只有10位,再多 ...
随机推荐
- android draw9patch工具使用
1.作用 将图片制作android .9图片xxx.9.png xxx.9.jpg xxx.9.gif 这些图片在android上拉伸时,边角不变形,不影响效果. 2.工具位置 Android的S ...
- Finally语句
- [已读]跨终端web
13年去听阿里技术嘉年华,鬼道分享了<移动优先前端产品的探索>.今年我买这本书,事实上是被高大上的目录吸引→ → 买来后发现,嘿,似曾相识啊,但还是老老实实得花一下午把书翻了一遍.翻完之后 ...
- 组件的 render 方法
React.js 中一切皆组件,用 React.js 写的其实就是 React.js 组件.我们在编写 React.js 组件的时候,一般都需要继承 React.js 的 Component(还有别的 ...
- AJPFX的内存管理小结
管理范围:任何继承于 NSObject的对象原理:每一个对象都有引用计数器当使用alloc new 和 copy创建对象时引用计数器被设置为1给对象发送一条retain消息 ,引用计数器加1 ...
- 设计 REST API 的13个最佳实践
写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口这件事情就成为了家常便饭,并且,还伴随着无数的争论与无奈.编写友好的 restful api 不论对于你的同事,还是将来作为第三方服 ...
- iOS应用版本更新(自动提醒用户更新代码)
在#import "AppDelegate.h" 文件中的application:(UIApplication *)application didFinishLaunchingWi ...
- Linux PHP的运行模式
关系图 首先聊一下服务器,常见的web server类型有apache和nginx Apache工作模式 Apache的工作模式是Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦 ...
- 原创:mysql下载 实战 最强最全的无脑白痴版 给小白的爱
- CAD交互绘制带颜色宽度的直线(网页版)
用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...