记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;
}