Дана строка S. Выведите лексикографически наименьшую возможную строку. Вы можете внести минимальные изменения в символы в строке и переставить строку. Примеры:

 void makeSmallestPalindrome(string s) {
    int n = s.size();
    unordered_map<char, int> mp;
    int oddnums = 0;
    for (auto i: s) mp[i]++;
    
    for (char i = 'a'; i <= 'z'; i++) {
        if(mp[i]%2)oddnums++;   
    }
    //update count to make only one odd character exists
    if (oddnums > 1)  {
     for (char i = 'a'; i <= 'z'; i++) {
         // cout << mp[i] << " " << i << " " << oddnums << endl;
        if (mp[i] && mp[i]%2) {
            if (oddnums > 1) {
                mp[i]++;
                oddnums-=2;
            } 
            else if (oddnums == 1) oddnums--; 
            else mp[i]--;
            
        } 
    }   
    }
    
    string f, m, s2;
    f = m = s = "";
    for (char i = 'a'; i <= 'z'; i++) {
        
        if (mp[i]) {
            if (mp[i]%2) m = i;
            f += i*(mp[i]/2);
        }
    }
    s2 = f;
    reverse(s2.begin(), s2.end());
    cout<< f+m+s2;
    
}
int main() {
    string s = "aabcd";
    // s = "aabc";
    makeSmallestPalindrome(s);
}
/**
    cnt all the characters    
*/