您的位置:首页 > Web前端

HDOJ 5487 Difference of Languages

2015-09-28 15:17 295 查看
记dp[i][j] 代表走到了第一个dfa的i号节点,走到了第二个自动机的j号节点.....然后就可以转移了......

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int maxn = 1005;

struct node
{
int s1, s2, pre, tran;
node(int s1 = 0, int s2 = 0, int tran = 0, int pre = 0) : s1(s1), s2(s2), tran(tran), pre(pre) {}
};

node q[maxn * maxn];
int visa[maxn], visb[maxn];
bool vis[maxn][maxn];
int ga[maxn][26], gb[maxn][26];
char s[100];
int res[maxn * maxn];

int check(int s1, int s2)
{
return (visa[s1] ^ visb[s2]);
}

bool bfs()
{
int l = 0, r = 0;
q[r++] = node(0, 0, 0, -1);
vis[0][0] = 1;
memset(vis, 0, sizeof vis);
while(l < r) {
int s1 = q[l].s1, s2 = q[l].s2;
l++;
int t = check(s1, s2);
if(t == 1) {
int cnt = 0, t = l-1;
while(q[t].pre != -1) {
res[cnt++] = q[t].tran;
t = q[t].pre;
}
for(int i = cnt-1; i >= 0; i--) printf("%c", res[i] + 'a');
return true;
}

for(int i = 0; i < 26; i++) {
int ns1 = ga[s1][i];
int ns2 = gb[s2][i];
if(!vis[ns1][ns2]) vis[ns1][ns2] = 1, q[r++] = node(ns1, ns2, i, l-1);
}
}
return false;
}

void work()
{
int n1, n2, m1, m2, k1, k2;
scanf("%d%d%d", &n1, &m1, &k1);
for(int i = 0; i <= n1; i++) {
visa[i] = false;
for(int j = 0; j < 26; j++)
ga[i][j] = n1;
}
for(int i = 1; i <= k1; i++) {
int x;
scanf("%d", &x);
visa[x] = true;
}

for(int i = 1; i <= m1; i++) {
int u, v;
scanf("%d%d%s", &u, &v, s);
ga[u][s[0] - 'a'] = v;
}

scanf("%d%d%d", &n2, &m2, &k2);
for(int i = 0; i <= n2; i++) {
visb[i] = false;
for(int j = 0; j < 26; j++)
gb[i][j] = n2;
}
for(int i = 1; i <= k2; i++) {
int x;
scanf("%d", &x);
visb[x] = true;
}

for(int i = 1; i <= m2; i++) {
int u, v;
scanf("%d%d%s", &u, &v, s);
gb[u][s[0] - 'a'] = v;
}

if(!bfs()) printf("0");
printf("\n");
}

int main()
{
int _;
scanf("%d", &_);
for(int i = 1; i <= _; i++) {
printf("Case #%d: ", i);
work();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: