// Time:  O(nlogn)
// Space: O(n)

class Solution {
public:
    vector<vector<string>> groupStrings(vector<string>& strings) {
        unordered_map<string, multiset<string>> groups;
        for (const auto& str : strings) {  // Grouping.
            groups[hashStr(str)].insert(str);
        }
        
        vector<vector<string>> result;
        for (const auto& kvp : groups) {
            vector<string> group;
            for (auto& str : kvp.second) {  // Sorted in a group.
                group.emplace_back(move(str));
            }
            result.emplace_back(move(group));
        }
        
        return result;
    }
    
    string hashStr(string str) {
        const char base = str[0];
        for (auto& c : str) {
            c = 'a' + ((c - base) >= 0 ? c - base : c - base + 26);
        }
        return str;
    }
};