1. 程式人生 > 其它 >[HAOI2008]玩具取名

[HAOI2008]玩具取名

[HAOI2008]玩具取名

題目描述

某人有一套玩具,並想法給玩具命名。首先他選擇WING四個字母中的任意一個字母作為玩具的基本名字。然後他會根據自己的喜好,將名字中任意一個字母用“WING”中任意兩個字母代替,使得自己的名字能夠擴充得很長。 現在,他想請你猜猜某一個很長的名字,最初可能是由哪幾個字母變形過來的。

輸入輸出格式

輸入格式

第一行四個整數W、I、N、G。表示每一個字母能由幾種兩個字母所替代。 接下來W行,每行兩個字母,表示W可以用這兩個字母替代。 接下來I行,每行兩個字母,表示I可以用這兩個字母替代。 接下來N行,每行兩個字母,表示N可以用這兩個字母替代。 接下來G行,每行兩個字母,表示G可以用這兩個字母替代。 最後一行一個長度不超過Len的字串。表示這個玩具的名字。

輸出格式

一行字串,該名字可能由哪些字母變形而得到。(按照WING的順序輸出) 如果給的名字不能由任何一個字母變形而得到則輸出“The name is wrong!”

輸入輸出樣例

輸入樣例 #1

1 1 1 1
II
WW
WW
IG
IIII

輸出樣例 #1

IN

說明

30%資料滿足Len<=20,W、I、N、G<=6 100%資料滿足Len<=200,W、I、N、G<=16
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 
 5 using namespace
std; 6 const int M = 300; 7 8 int W, I, N, G; 9 int n; 10 char s[M]; 11 int m[M]; 12 int vis[20][20][20]; 13 14 int f[M][M][5]; 15 16 int main() 17 { 18 scanf("%d %d %d %d", &W, &I, &N, &G); 19 m['W'] = 1; 20 m['I'] = 2; 21 m['N'] = 3; 22 m['G'] = 4; 23 for (int
i = 1; i <= W; i++) 24 { 25 char c = getchar(); 26 while(c != 'W' && c != 'I' && c != 'N' && c != 'G') c = getchar(); 27 char d = getchar(); 28 vis[m[c]][m[d]][1] = 1; 29 } 30 for (int i = 1; i <= I; i++) 31 { 32 char c = getchar(); 33 while(c != 'W' && c != 'I' && c != 'N' && c != 'G') c = getchar(); 34 char d = getchar(); 35 vis[m[c]][m[d]][2] = 1; 36 } 37 for (int i = 1; i <= N; i++) 38 { 39 char c = getchar(); 40 while(c != 'W' && c != 'I' && c != 'N' && c != 'G') c = getchar(); 41 char d = getchar(); 42 vis[m[c]][m[d]][3] = 1; 43 } 44 for (int i = 1; i <= G; i++) 45 { 46 char c = getchar(); 47 while(c != 'W' && c != 'I' && c != 'N' && c != 'G') c = getchar(); 48 char d = getchar(); 49 vis[m[c]][m[d]][4] = 1; 50 } 51 scanf("%s", s + 1); 52 n = strlen(s + 1); 53 54 for(int i = 1; i <= n; i++) 55 { 56 f[i][i][m[s[i]]] = 1; 57 } 58 59 for (int len = 1; len <= n; len++) 60 { 61 for (int l = 1; l + len - 1 <= n; l++) 62 { 63 int r = l + len - 1; 64 for(int k = l; k < r; k++) 65 { 66 for(int i = 1;i <= 4; i++) 67 { 68 for(int x = 1; x <= 4; x++) 69 { 70 for(int y = 1; y <= 4; y++) 71 { 72 f[l][r][i] = f[l][r][i] || f[l][k][x] && f[k + 1][r][y] && vis[x][y][i]; 73 } 74 } 75 } 76 } 77 } 78 } 79 bool flag = f[1][n][1] || f[1][n][2] || f[1][n][3] || f[1][n][4]; 80 if(f[1][n][1]) putchar('W'); 81 if(f[1][n][2]) putchar('I'); 82 if(f[1][n][3]) putchar('N'); 83 if(f[1][n][4]) putchar('G'); 84 if(!flag) puts("The name is wrong!"); 85 return 0; 86 }