template<typename Arg, typename... Args>
void Log(Arg&& arg, Args&&... args)
{
std::ostringstream oss;
oss << std::boolalpha;
oss << std::forward<Arg>(arg);
((oss << " " << std::forward<Args>(args)), ...);
std::cout << oss.str() << "\n";
}
template<typename Arg, typename Iter>
void Log_c(Arg&& arg, Iter first, Iter last)
{
std::ostringstream oss;
oss << std::boolalpha;
oss << std::forward<Arg>(arg);
while (first != last)
{
oss << " " << *first;
first++;
}
std::cout << oss.str() << "\n";
}
class Solution {
public:
int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score)
{
std::vector<int> char_count(128, -1000000000);
m_sz = words.size();
for (const auto w : letters)
{
if (char_count[w] == -1000000000)
{
char_count[w] = 1;
}
else
{
char_count[w]++;
}
}
int result{};
dfs(char_count, score, words, 0, result);
return m_result;
}
private:
int m_sz{};
int m_result{};
void dfs(std::vector<int>& char_count, const std::vector<int>& char_score, const std::vector<std::string>& words, int pos, int& result)
{
// Log("cur result", result, pos);
if (pos >= m_sz)
{
m_result = std::max(m_result, result);
}
for (int cur_pos = pos; cur_pos < m_sz; ++cur_pos)
{
if (auto val = check(char_count, char_score, words[cur_pos]); val >= 0)
{
result += val;
dfs(char_count, char_score, words, cur_pos + 1, result);
result -= val;
clear(char_count, words[cur_pos]);
}
else
{
// Log("check fail", pos, m_sz);
dfs(char_count, char_score, words, cur_pos + 1, result);
}
}
}
int check(std::vector<int>& char_count, const std::vector<int>& char_score, const std::string& word)
{
bool st{true};
int res{};
for (int c : word)
{
// Log("char", c, char_count[c]);
if (char_count[c] <= 0)
{
st = false;
}
else
{
res += char_score[c - 'a'];
}
char_count[c]--;
}
// Log("check", word, "score", res);
if (st == false)
{
clear(char_count, word);
return -1;
}
return res;
}
void clear(std::vector<int>& char_count, const std::string& word)
{
for (char c : word)
{
char_count[c]++;
}
}
};