Ok
class Gruppi
{
      vector<int> hashGruppi;
public:
    Gruppi();
    Gruppi(int& hkparola)
    {
        hashGruppi.push_back(hkparola);
    };
    ~Gruppi();
    inline int hashGruppiSize()    {        return hashGruppi.size();    }
    inline void inserisci(int& hkparola)    {        hashGruppi.push_back(hkparola);    }
    inline void svuota()    {        hashGruppi.clear();    }
    inline vector<int> ritornaVettore()    {        return hashGruppi;    }
	
	inline void elimina(int& hkparola)    {
        for(vector<int>::iterator posIt6 = hashGruppi.begin(); posIt6 != hashGruppi.end(); ++posIt6)        {
            if(*posIt6==hkparola)            {
                *posIt6=hashGruppi.back();
                hashGruppi.back()=hkparola;
                hashGruppi.pop_back();
                break;
            }
        }
    }
    
};
inline int funzHash(string& parolaHash)
{
    int h = 5381;
    for (int i=0; i<parolaHash.size(); ++i)    {
        h = h * 33 + parolaHash[i];
    }
    h=abs(h);
    return h;
}
int main()
{
    vector<Gruppi*> vecGruppi;
    vector<int> lettereGruppo;
    map<int,int> keyGruppi;/// una map di <hash_key, group_id>
    string input,parola,parola2;
    int dimCoda = 0,b = 0;
    char s;
    while(input != "<END>")    {
        getline(cin, input);
        stringstream ssin(input);
        s=0,parola="",parola2="";
        ssin >> s;
        if (s == 'i')        {
            lettereGruppo.clear();
            vecGruppi.clear();
            keyGruppi.clear();
            ssin >> dimCoda>> b;
        }
        else if (s == 'e')        {
            int x=0;
            lettereGruppo.resize(dimCoda);
            while(x < dimCoda)            {
                ssin >> parola;
                int hk=funzHash(parola);
                keyGruppi.insert(pair<int,int>(hk,x));
                lettereGruppo[x]=parola.size();
                vecGruppi.push_back(new Gruppi(hk));
                x++;
            }
        }
        else if (s == 'm' || s == 'u' || s == 's')        {
            ssin >> parola >> parola2;
            int hk1=funzHash(parola),hk2=funzHash(parola2);
            map<int,int>::iterator it;
            map<int,int>::iterator it2;
            int grupId1=0,grupId2=0;
            bool ver0=false,ver1=false;
            it=keyGruppi.find(hk1);
            if(it != keyGruppi.end())            {
                grupId1=it->second;
                ver0=true;
            }
            if(s == 'm' || s == 'u')            {
                it2=keyGruppi.find(hk2);
                if(it2 != keyGruppi.end())                {
                    grupId2=it2->second;
                    ver1=true;
                }
            }
            if(ver0 && s == 's')            { //qui devo stampare il totale di parola e lettere del vettore di parola1
                cout<<vecGruppi[grupId1]->hashGruppiSize()<<" "<<lettereGruppo[grupId1]<<endl;
            }
            if(ver1 && ver0 && grupId2!=grupId1)            {
                if(s == 'm')                { //qui devo spostare parola1 dal vettore di parola1 al vettore di parola2
                    vecGruppi[grupId1]->elimina(hk1);
                    vecGruppi[grupId2]->inserisci(hk1);
                    it->second=grupId2;
                    lettereGruppo[grupId1]-=parola.size();
                    lettereGruppo[grupId2]+=parola.size();
                }
                else if(s == 'u' )                { //qui devo unire il vettore di parola1 col vettore di parola2
                    map<int,int>::iterator it3;
                    vector<int> temp=vecGruppi[grupId1]->ritornaVettore();
                    for(vector<int>::iterator posIt3 = temp.begin(); posIt3 != temp.end(); ++posIt3)                    {
                        it3=keyGruppi.find(*posIt3);
                        it3->second=it2->second;
                        vecGruppi[grupId2]->inserisci(*posIt3);
                    }
                    vecGruppi[grupId1]->svuota();
                    lettereGruppo[grupId2]+=lettereGruppo[grupId1];
                    lettereGruppo[grupId1]=0;
                }
            }
        }///else if (s == 'm' || s == 'u' || s == 's')
    }///fine while(input != "<END>")
    return 0;
Mi chiedevo come renderlo più performante, deve essere veloce almeno il doppio di quanto lo è ora