<p>You are given an array of strings <code>words</code>. Each element of <code>words</code> consists of <strong>two</strong> lowercase English letters.</p>

<p>Create the <strong>longest possible palindrome</strong> by selecting some elements from <code>words</code> and concatenating them in <strong>any order</strong>. Each element can be selected <strong>at most once</strong>.</p>

<p>Return <em>the <strong>length</strong> of the longest palindrome that you can create</em>. If it is impossible to create any palindrome, return <code>0</code>.</p>

<p>A <strong>palindrome</strong> is a string that reads the same forward and backward.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> words = [&quot;lc&quot;,&quot;cl&quot;,&quot;gg&quot;]
<strong>Output:</strong> 6
<strong>Explanation:</strong> One longest palindrome is &quot;lc&quot; + &quot;gg&quot; + &quot;cl&quot; = &quot;lcggcl&quot;, of length 6.
Note that &quot;clgglc&quot; is another longest palindrome that can be created.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> words = [&quot;ab&quot;,&quot;ty&quot;,&quot;yt&quot;,&quot;lc&quot;,&quot;cl&quot;,&quot;ab&quot;]
<strong>Output:</strong> 8
<strong>Explanation:</strong> One longest palindrome is &quot;ty&quot; + &quot;lc&quot; + &quot;cl&quot; + &quot;yt&quot; = &quot;tylcclyt&quot;, of length 8.
Note that &quot;lcyttycl&quot; is another longest palindrome that can be created.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> words = [&quot;cc&quot;,&quot;ll&quot;,&quot;xx&quot;]
<strong>Output:</strong> 2
<strong>Explanation:</strong> One longest palindrome is &quot;cc&quot;, of length 2.
Note that &quot;ll&quot; is another longest palindrome that can be created, and so is &quot;xx&quot;.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= words.length &lt;= 10<sup>5</sup></code></li>
	<li><code>words[i].length == 2</code></li>
	<li><code>words[i]</code> consists of lowercase English letters.</li>
</ul>

class Solution {
private:
    string revstr(const string& src){
        stringstream dst_stream;
        for(int i = src.length() - 1; i >= 0; --i){
            dst_stream << src[i];
        }
        return dst_stream.str();
    }

public:
    int longestPalindrome(vector<string>& words) {
        unordered_map<string,int> str_cnts;
        for(auto& cur_str : words){
            ++str_cnts[cur_str];
        }

        unordered_set<string> visited;
        int tot_len = 0;
        int max_sym_len = 0;
        for(auto& cur_pair : str_cnts){
            if(visited.find(cur_pair.first) != visited.end()) continue;
            string cur_rev_str = revstr(cur_pair.first);
            if(cur_rev_str == cur_pair.first){
                if(cur_pair.second%2 != 0){
                    max_sym_len = max((int)cur_pair.first.length(), max_sym_len);
                }
                tot_len += 2 * (cur_pair.second/2) * cur_pair.first.length();
                visited.insert(cur_pair.first);
            }else{
                if(str_cnts.find(cur_rev_str) != str_cnts.end()){
                    tot_len += 2 * cur_pair.first.length() * min(cur_pair.second, str_cnts[cur_rev_str]);
                    visited.insert(cur_pair.first);
                    visited.insert(cur_rev_str);
                }
            }

        }

        return tot_len + max_sym_len;

    }
};
173200