void Checker::parse(ManagerBase* m, std::vector<Card>& src, CardContainer& res) { std::sort(src.begin(), src.end(), CardSortCmp(m)); res.clear(); CardUnit single; single.mask.set(CardMask::Single); std::vector<CardUnit> pairUnit; Card pre; for (auto& i : src) { if (pre == i) { pairUnit.push_back({CardMask::Pair|CardMask(m, i),{i, i}}); pre.set(Card::Null); } else { if (pre.value() != Card::Null) { single.mask.merge(CardMask(m, pre)); single.cards.push_back(pre); } pre = i; } } if (pre.value() != Card::Null) { single.mask.merge(CardMask(m, pre)); single.cards.push_back(pre); } if (!pairUnit.empty()) { size_t i = 0; for (size_t j = 1; j < pairUnit.size(); ++j) { if (canConcat(m, pairUnit[i].cards.back(), pairUnit[j].cards[0])) { pairUnit[i].cards.insert(pairUnit[i].cards.end(), pairUnit[j].cards.begin(), pairUnit[j].cards.end()); } else { res.put(pairUnit[i]); i = j; } } res.put(pairUnit[i]); if (res.size() > 1 && pairUnit.size() > 2) { res.sort([](const CardUnit& u1, const CardUnit& u2) { return u1.cards.size() > u2.cards.size(); }); } } if (!single.cards.empty()) { res.put(single); } }
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) { if(canConcat(beginWord, endWord)) return 2; wordList.insert(endWord); queue<pair<string,int>> q; q.push(make_pair(beginWord, 1)); while(!q.empty()){ auto current = q.front(); q.pop(); auto neighbors = findNeighbors(current.first, wordList); for(auto& w : neighbors){ if(w == endWord) return current.second + 1; q.push(make_pair(w, current.second + 1)); } } return 0; }