模拟,
记录元音个数和最后一个元音,根据个数,和最后一个元音排序
。将元音个数相等最后一个元音不等的放到一个对里,将个数相等最后一个元音也相等的放到另一个对里。
挨个输出。当元音相等的较多时,补充一下即可。
注意:vector的size是无符号整数,不能直接相减
学了一手emplace_back///比push快
int n;
struct Word
{
    string word;
    int num;
    char last;
    bool operator < (const Word& that) const
    {
        if (this->num != that.num)
            return this->num < that.num;
        return this->last < that.last;
    }
}words[MAXN];

int main()
{
    cin >> n;
    for (int i = 1;i <= n;i++)
    {
        cin >> words[i].word;
        for (auto c:words[i].word)
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
                words[i].num++,words[i].last = c;
    }
    sort(words+1, words+1+n);
    vector<pair<int, int> > fi, se;
    int pos = 1,w = -1, cnt = 1;
    while(pos <= n)
    {
        if (words[pos].num == words[pos+1].num && words[pos].last == words[pos+1].last)
            se.push_back(make_pair(pos, pos+1)),pos += 2;
        else if (words[pos].num != cnt)
            w = pos,cnt = words[pos].num,pos++;
        else if (w == -1)
            w = pos,pos++;
        else
            fi.push_back(make_pair(w, pos)),w = -1,pos++;
    }
    int s1 = fi.size(), s2 = se.size(),res = 0;
    res += min(s1, s2) + max(0, (s2-s1)/2);
    cout << res << endl;
    int i;
    for (i = 0;i < min(fi.size(), se.size());i++)
    {
        cout << words[fi[i].first].word << ' ' << words[se[i].first].word << endl;
        cout << words[fi[i].second].word << ' ' << words[se[i].second].word << endl;
    }
    for (;i+1 < se.size();i+=2)
    {
        cout << words[se[i].first].word << ' ' << words[se[i+1].first].word << endl;
        cout << words[se[i].second].word << ' ' << words[se[i+1].second].word << endl;
    }
    //stop;
    return 0;
}