f [ i ] [ j ] [ c ] 表示i到j的字符能否由c转化到
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
map <char,int> mp;
const int N=2e2+5;
int n,a[N],s[5][20][2],p[5];
char x[2],z,rev[5];
bool f[N][N][5],flag;
bool ok(int i,int k,int c,int j,int l)
{
if(!f[i][i+l-1][s[c][j][0]]) return 0;
if(!f[i+l][i+k][s[c][j][1]]) return 0;
return 1;
}
int main()
{
mp['W']=1; mp['I']=2;
mp['N']=3; mp['G']=4;
rev[1]='W'; rev[2]='I';
rev[3]='N'; rev[4]='G';
for(int i=1;i<=4;i++) p[i]=read();
for(int i=1;i<=4;i++)
for(int j=1;j<=p[i];j++) {
scanf("%s",x);
for(int k=0;k<=1;k++)
s[i][j][k]=mp[x[k]];
}
z=getchar();
while(z<'A'||z>'Z') z=getchar();
while(z>='A'&&z<='Z') {
a[++n]=mp[z];
z=getchar();
}
for(int i=1;i<=n;i++) f[i][i][a[i]]=1;
for(int k=1;k<n;k++)
for(int i=1;i<=n-k;i++)
for(int c=1;c<=4;c++)
for(int j=1;j<=p[c];j++)
for(int l=1;l<=k;l++)
if(ok(i,k,c,j,l))
f[i][i+k][c]=1;
for(int i=1;i<=4;i++)
if(f[1][n][i]) {
flag=1;
cout<<rev[i];
}
if(!flag) cout<<"The name is wrong!";
return 0;
}