program bzoj1055;
const maxn=210;
var f:array[0..maxn,0..maxn,0..4]of boolean;
num:array[1..4]of longint;
w:array[0..4,0..30]of string;
flag:boolean;
function cal(ch:char):longint;
begin
case ch of
'W':exit(1);
'I':exit(2);
'N':exit(3);
'G':exit(4);
end;
end;
function cal(ch:longint):char;
begin
flag:=false;
case ch of
1:exit('W');
2:exit('I');
3:exit('N');
4:exit('G');
end;
end;
procedure init;
var i,j,k,l,ww,m:longint;
s:string;
begin
for i:=1 to 4 do
read(num[i]);
readln;
for i:=1 to 4 do
for j:=1 to num[i] do
readln(w[i][j]);
readln(s);
m:=length(s);
fillchar(f,sizeof(f),false);
for i:=1 to m do
f[i][i][cal(s[i])]:=true;
for j:=2 to m do
for i:=1 to m-j+1 do
for k:=i to i+j-2 do
for l:=1 to 4 do
for ww:=1 to num[l] do
f[i][i+j-1][l]:=f[i][i+j-1][l]
or (f[i][k][cal(w[l][ww][1])] and f[k+1][i+j-1][cal(w[l][ww][2])]);
flag:=true;
for i:=1 to 4 do
if f[1][m][i] then
write(cal(i));
if flag then write('The name is wrong!');
end;
begin
init;
end.
评论