#include #define endl '\n' using namespace std; int letters[30]; bool possible_start(int letter, string a) { int d = a.size(), br = 1, i; char z = char(letter + 'a'); for (i = 0; i < d; i++) { if (a[i] == z)break; } for (i = i+1; i < d; i++) { if (br == letters[letter])return 1; else if (a[i] != a[i] && br < letters[letter])return 0; br++; } return 1; } void Print(string a) { cout << a << endl; } bool null(string a) { int i, d = a.size(); for (i = 0; i < d; i++) if (a[i] != '0')return 0; return 1; } bool correct_constructor(int start, string a) { int i = start+1, j, d = a.size(), br, letter, left_zero, right_zero; bool t = true; while (a[i] == a[i-1]) { a[i-1] = '0'; i++; } a[i-1] = '0'; left_zero = start-1; right_zero = i; while (!null(a)) { letter = 0; br = 1; for (i = left_zero; i >= 0; i--) if (a[i] != '0') { left_zero = i-1; letter = a[i]-'a'; a[i] = '0'; break; } if (!letter) for (i = right_zero; i < d; i++) { if (a[i] != '0') { right_zero = i+1; letter = a[i]-'a'; a[i] = '0'; break; } } for (i = left_zero; i >= 0; i--) { if (a[i]-'a'==letter){br++;a[i] = '0';} else break; } for (i = right_zero; i < d; i++) { if (a[i]-'a' == letter){br++;a[i] = '0';} else break; } Print(a); if (letters[letter] != br){return 0;} } return 1; } int main() { ifstream cin ("constructor.in"); ofstream cout("constructor.out"); ios::sync_with_stdio(0); cin.tie(NULL); int n, m, i, num, j, k; char z; string s; cin >> m >> n; for (i = 0; i < n; i++) { cin >> z >> num; letters[z-'a']=num; } for (i = 0; i < m; i++) { int letters_string[30]; bool t = false; memset(letters_string, 0, sizeof(letters_string)); cin >> s; int d = s.size(); for (j = 0; j < d; j++)letters_string[s[j]-'a']++; for (j = 0; j < 26; j++) { if (letters[j] != letters_string[j]) { cout << "No" << endl; t = 1; break; } } if (t == 1)continue; for (j = 0; j < 26; j++) { if (letters[j] != 0 && possible_start(j, s) == true) { for (k = 0; k < d; k++) { if (s[k]-'a' == j){t = correct_constructor(k, s); break;} } if (t == 1){cout << "Yes" << endl;} if (t == 0){cout << "No" << endl;} break; } } } return 0; } /* 5 5 a 2 b 3 c 1 x 2 y 4 aabbbcxxyyyy ycbaabbxxyyy ababbxxyyycy xxbacabbyyy yaabbbcxyyyx */