Difference of Languages

Time Limit: 1000ms
Memory Limit: 32768KB

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

 
解题:直接搜啊,根据双方的转移状态进行转移,当能够被一个AC被另一个不能AC说明找到了,因为是bfs优先搜索字典序小的,所以自然是和题意的
 #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的更多相关文章

  1. HDU 5487 Difference of Languages(BFS)

    HDU 5487 Difference of Languages 这题从昨天下午2点开始做,到现在才AC了.感觉就是好多题都能想出来,就是写完后debug很长时间,才能AC,是不熟练的原因吗?但愿孰能 ...

  2. hdu 4715 Difference Between Primes

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Description All you kn ...

  3. HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))

    Difference Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. HDU 5486 Difference of Clustering 暴力模拟

    Difference of Clustering HDU - 5486 题意:有n个实体,新旧两种聚类算法,每种算法有很多聚类,在同一算法里,一个实体只属于一个聚类,然后有以下三种模式. 第一种分散, ...

  5. HDU 5486 Difference of Clustering 图论

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5486 题意: 给你每个元素一开始所属的集合和最后所属的集合,问有多少次集合的分离操作,并操作和不变操 ...

  6. hdu 4715 Difference Between Primes(素数筛选+树状数组哈希剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=4715 [code]: #include <iostream> #include <cstdio ...

  7. HDU 4715 Difference Between Primes (打表)

    Difference Between Primes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

  8. hdu 4715 Difference Between Primes (打表 枚举)

    Difference Between Primes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  9. HDU 5936 Difference(折半搜索(中途相遇法))

    http://acm.hdu.edu.cn/showproblem.php?pid=5936 题意: 定义了这样一种算法,现在给出x和k的值,问有多少个y是符合条件的. 思路: y最多只有10位,再多 ...

随机推荐

  1. h5-21-文件操作-读取文件内容

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Java三大特性之---封装

    封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保 ...

  3. windows下常用的一些shell命令

    看的视频上都是linux系统的shell命令,和windows区别很多.所以整理了windows常用的一些shell命令. 注意:并不是每个都试验过,使用时还需自己验证下. 学system和os,su ...

  4. [BZOJ1040][ZJOI2008]骑士 基环树DP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目给出了$n$个点和$n$条无向边,即一棵基环树或者基环树森林. 如果题目给的关系 ...

  5. docker最新版本以及docker-compose安装脚本

    docker最新版本以及docker-compose编排工具安装脚本 git clone https://github.com/luckman666/shell_scripts.git cd shel ...

  6. iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G

    如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Re ...

  7. 微信小程序组件解读和分析:一、view(视图容器 )

    view组件说明:    视图容器    跟HTML代码中的DIV一样,可以包裹其他的组件,也可以被包裹在其他的组件内部.用起来比较自由随意,没有固定的结构. view组件的用法: 示例项目的wxml ...

  8. Failed to obtain lock on file /usr/local/nagios/var/ndo2db.lock: Permission denied : Permission denied

    Failed to obtain lock on file /usr/local/nagios/var/ndo2db.lock: Permission denied  : Permission den ...

  9. java实现排序的几种方法

    package com.ywx.count; import java.util.Scanner; /** * 题目:排序的几种方式(汇总及重构) * @author Vashon(yangwenxue ...

  10. hdu 5402 Travelling Salesman Problem (技巧,未写完)

    题意:给一个n*m的矩阵,每个格子中有一个数字,每个格子仅可以走一次,问从(1,1)走到(n,m) 的路径点权之和. 思路: 想了挺久,就是有个问题不能短时间证明,所以不敢下手. 显然只要n和m其中一 ...