区间dp。记录可行性即可。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int c[],len;
bool f[][][],mp[][],flag;
char ch1,ch2;
char gt()
{
char tmp;
scanf("%c",&tmp);
while(tmp<||tmp>)scanf("%c",&tmp);
return tmp;
}
int num(char c)
{
if(c=='W')return ;if(c=='I')return ;
if(c=='N')return ;if(c=='G')return ;
}
char chr(int a)
{
if(a==)return 'W';if(a==)return 'I';
if(a==)return 'N';if(a==)return 'G';
}
int main()
{
scanf("%d%d%d%d",&c[],&c[],&c[],&c[]);
for(int i=;i<=;i++)
for(int j=;j<=c[i];j++)
{
scanf(" %c%c",&ch1,&ch2);
mp[num(ch1)*+num(ch2)][i]=;
}
ch1=gt();
while(++len)
{
f[len][len][num(ch1)]=;
scanf("%c",&ch1);
if(ch1=='\n')break;
}
for(int i=;i<=len;i++)
{
int lm=len-i+;
for(int l=;l<=lm;l++)
{
int r=l+i-;
for(int k=l;k<r;k++)
for(int x=;x<=;x++)
if(f[l][k][x])
for(int y=;y<=;y++)
if(f[k+][r][y])
for(int j=;j<=;j++)
f[l][r][j]|=mp[x*+y][j];
}
}
for(int i=;i<=;i++)
if(f[][len][i])printf("%c",chr(i)),flag=;
if(!flag)printf("The name is wrong!");
return ;
}