class Solution {
public:
vector<string> wordsAbbreviation(vector<string>& dict) {
vector<string> res(dict.size());
vector<int> lenAbbr(dict.size());
for (int i = 0; i < dict.size(); i++) {
int len = dict[i].size(); lenAbbr[i] = len - 2;
res[i] = getAbbr(dict[i], lenAbbr[i]);
}
for (int i = 0; i < dict.size(); i++) {
while (true) {
unordered_set<int> duplicate;
for (int j = i + 1; j < dict.size(); j++)
if (res[i] == res[j]) duplicate.insert(j);
if (duplicate.empty()) break;
duplicate.insert(i);
for (int d : duplicate)
res[d] = getAbbr(dict[d], --lenAbbr[d]);
}
}
return res;
}
private:
string getAbbr(string s, int lenAbbr) {
if (lenAbbr < 2) return s;
return s.substr(0, s.size() - 1 - lenAbbr) + to_string(lenAbbr) + s[s.size() - 1];
}
};