#include #include #include using namespace std; #define flow(from,to) (f[from][to] - f[to][from]) #define residue(from,to,r) (cap[from][to] >= 0 ? cap[from][to] - flow(from,to) : r) long long int get_max_flow(int s, int t, const vector >& cap){ int n = cap.size(); vector > f(n, vector(n, 0)); long long int flow_sum = 0; while(1){ queue q; vector prev(n, -1); prev[s] = -2; q.push(s); while(!q.empty() && prev[t] == -1){ int pos = q.front(); q.pop(); for (int i = 0; i < n; ++i){ if (prev[i] == -1 && residue(pos,i,1) > 0){ prev[i] = pos; q.push(i); } } } if (prev[t] == -1) return flow_sum; long long int r = -1; for (int i = t; prev[i] >= 0; i = prev[i]){ long long int res = residue(prev[i],i,r); if (r < 0 || res < r) r = res; } if (r > 0){ for(int i = t; prev[i] >= 0; i = prev[i]){ f[prev[i]][i] += r; } flow_sum += r; } } } int encode1(string& day){ if (day == "Sunday") return 0; else if (day == "Monday") return 1; else if (day == "Tuesday") return 2; else if (day == "Wednesday") return 3; else if (day == "Thursday") return 4; else if (day == "Friday") return 5; else if (day == "Saturday") return 6; } int encode2(vector& days){ int result = 0; for (int i = 0; i < (int)days.size(); i++) result += 1 << encode1(days[i]); return result; } bool connected(int node, int day){ return ((node & (1 << day)) != 0); } int main(){ /* s = 0 students = 1-128 days = 129-135 t = 136 */ int N; long long int weeks; while(cin >> N){ if (N == 0) break; const int s = 0, t = 136; vector > cap(137, vector(137, 0)); for (int i = 0; i <= 127; i++){ for (int j = 0; j <= 6; j++){ if (connected(i, j)) cap[i+1][j+129] = -1;//infinity } } cin >> weeks; for (int i = 129; i <= 135; i++){ cap[i][t] = weeks; } long long int rest_sum = 0; for (int i = 0; i < N; i++){ long long int rest; int number_of_days; cin >> rest >> number_of_days; rest_sum += rest; vector days; for (int j = 0; j < number_of_days; j++){ string day; cin >> day; days.push_back(day); } int studentid = encode2(days); cap[s][studentid+1] += rest; } long long int max_flow = get_max_flow(s,t,cap); if (rest_sum == max_flow) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }