#include #include using namespace std; struct trie { struct vrchol { int pocet; vrchol *syn[26]; vrchol() { pocet=0; memset(syn, 0, sizeof(syn)); } }; vrchol *root; int celkem_druhu; long long celkem_kusu; trie() { root = new vrchol(); celkem_druhu = celkem_kusu = 0; } void update(const string &S, int add) { // Najdeme a je-li třeba, vytvoříme odpovídající vrchol vrchol *kde = root; for (unsigned i=0; isyn[idx]) kde->syn[idx] = new vrchol(); kde = kde->syn[idx]; } // Upravíme uloženou hodnotu celkem_kusu += add; if (kde->pocet == 0) ++celkem_druhu; kde->pocet += add; if (kde->pocet == 0) --celkem_druhu; } }; int main() { trie T; int zmena; string nazev; while (cin >> zmena >> nazev) { T.update(nazev,zmena); cout << "kusu: " << T.celkem_kusu << ", druhu: " << T.celkem_druhu << endl; } return 0; }