<p>You are given two strings <code>a</code> and <code>b</code> that consist of lowercase letters. In one operation, you can change any character in <code>a</code> or <code>b</code> to <strong>any lowercase letter</strong>.</p>

<p>Your goal is to satisfy <strong>one</strong> of the following three conditions:</p>

<ul>
	<li><strong>Every</strong> letter in <code>a</code> is <strong>strictly less</strong> than <strong>every</strong> letter in <code>b</code> in the alphabet.</li>
	<li><strong>Every</strong> letter in <code>b</code> is <strong>strictly less</strong> than <strong>every</strong> letter in <code>a</code> in the alphabet.</li>
	<li><strong>Both</strong> <code>a</code> and <code>b</code> consist of <strong>only one</strong> distinct letter.</li>
</ul>

<p>Return <em>the <strong>minimum</strong> number of operations needed to achieve your goal.</em></p>

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

<pre>
<strong>Input:</strong> a = &quot;aba&quot;, b = &quot;caa&quot;
<strong>Output:</strong> 2
<strong>Explanation:</strong> Consider the best way to make each condition true:
1) Change b to &quot;ccc&quot; in 2 operations, then every letter in a is less than every letter in b.
2) Change a to &quot;bbb&quot; and b to &quot;aaa&quot; in 3 operations, then every letter in b is less than every letter in a.
3) Change a to &quot;aaa&quot; and b to &quot;aaa&quot; in 2 operations, then a and b consist of one distinct letter.
The best way was done in 2 operations (either condition 1 or condition 3).
</pre>

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

<pre>
<strong>Input:</strong> a = &quot;dabadd&quot;, b = &quot;cda&quot;
<strong>Output:</strong> 3
<strong>Explanation:</strong> The best way is to make condition 1 true by changing b to &quot;eee&quot;.
</pre>

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

<ul>
	<li><code>1 &lt;= a.length, b.length &lt;= 10<sup>5</sup></code></li>
	<li><code>a</code> and <code>b</code> consist only of lowercase letters.</li>
</ul>

class Solution {
private:
    const int alphabet = 26;

    vector<int> countCharacters(string s) {

        vector<int> counter(alphabet, 0);
        for (const char& c: s)
            counter[c-'a']++;

        return counter;
    }

    int minMovesStr1StrictlyGreater(vector<int>& counter1, vector<int>& counter2) {

        // any char in str1 should be greater than any char in str2
        // counters should look like (x is arbitrary):
        // counter1: 0 0 0 x x ... x
        // counter2: x x x 0 0 ... 0

        int min_moves = INT_MAX;

        int right_counter = reduce(counter2.begin(), counter2.end());
        int left_counter = 0;

        for (int i = 0; i < alphabet-1; i++) {
            right_counter -= counter2[i];
            left_counter += counter1[i];
            min_moves = min(min_moves, right_counter+left_counter);
        }

        return min_moves;
    }

    int minMovesSameCharacters(vector<int>& counter1, vector<int>& counter2) {

        int min_moves = INT_MAX;

        int total_chars = 
            reduce(counter1.begin(), counter1.end()) +
            reduce(counter2.begin(), counter2.end());

        
        for (int i = 0; i < alphabet; i++)
            min_moves = min(
                min_moves,
                total_chars - counter1[i] - counter2[i]
            );
        
        return min_moves;
    }

public:
    int minCharacters(string a, string b) {

        vector<int> counter_a = countCharacters(a);
        vector<int> counter_b = countCharacters(b);

        return min({
            minMovesStr1StrictlyGreater(counter_a, counter_b),
            minMovesStr1StrictlyGreater(counter_b, counter_a),
            minMovesSameCharacters(counter_a, counter_b)
        });
    }
};
18600