bzoj1055: [HAOI2008]玩具起名儿

bzoj1055: [HAOI2008]玩具取名

状态 F[i,j,k] 表示从第i位到第j位,是否可以变换成字符k

const int N = 210;
const char T[6] = {" WING"};
bool Dp[N][N][5];
char Dat[N];
vector<int> need[5][5];

inline int turn(char x) {
	if(x == 'W') return 1;
	else if(x == 'I') return 2;
	else if(x == 'N') return 3;
	else return 4;
}

int T_T[5];

inline void Input() {
	For(i, 1, 4) scanf("%d", &T_T[i]);
	For(i, 1, 4)
		For(j, 1, T_T[i]) {
			scanf("%s", Dat + 1);
			need[turn(Dat[1])][turn(Dat[2])].pub(i);
		}
	scanf("%s", Dat + 1);
}

inline void Solve() {
	int Len = strlen(Dat + 1);
	clr(Dp, 0);
	For(i, 1, Len) Dp[i][i][turn(Dat[i])] = 1;
	For(j, 2, Len)
		For(i, 1, Len - j + 1)
			For(k, i, i + j - 2)
				For(p, 1, 4)
					if(Dp[i][k][p])
						For(q, 1, 4)
							if(Dp[k + 1][i + j - 1][q])
								Rep(s, sz(need[p][q]))
									Dp[i][i + j - 1][need[p][q][s]] = 1;
	bool flag = 0;
	For(i, 1, 4)
		if(Dp[1][Len][i]) flag = 1, printf("%c", T[i]);
	if(!flag) puts("The name is wrong!");
}

int main() {
    #ifndef ONLINE_JUDGE
    SETIO("1055");
    #endif
    Input();
    Solve();
    return 0;
}