Cod sursa(job #2305433)

Utilizator refugiatBoni Daniel Stefan refugiat Data 20 decembrie 2018 11:09:38
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.47 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
FILE*si=fopen("trie.in", "r");
FILE*so=fopen("trie.out", "w");
struct trie {
    int number;
    int children;
    vector<pair<char, trie*> > next;
    trie() {
        number=children=0;
    }
}*start;

int trie_prefix(trie *nod, char *str) {
    int pos = 0;
    while(*str!='\n') {
        vector<pair<char, trie*> >::iterator it;
        for(it=nod->next.begin(); it!=nod->next.end(); ++it)
            if(it->first==*str)
                break;
        if(it==nod->next.end())
            break;
        nod=it->second;
        str++;
        pos++;
    }
    return pos;
}
int trie_count(trie *nod, char *str) {
    while(*str!='\n') {
        vector<pair<char, trie*> >::iterator it;
        for(it=nod->next.begin(); it!=nod->next.end(); ++it)
            if(it->first==*str)
                break;
        if(it==nod->next.end())
            return 0;
        nod=it->second;
        str++;
    }
    return nod->number;
}
bool trie_delete(trie *nod, char *str) {
    if(*str=='\n')
        nod->number--;
    else {
        vector<pair<char, trie*> >::iterator it;
        for(it=nod->next.begin(); it!=nod->next.end(); ++it)
            if(it->first==*str)
                break;
        if(trie_delete(it->second, str+1)) {
            nod->children--;
            nod->next.erase(it);
        }
    }
    if(nod->children==0&&nod->number==0&&nod!=start) {
        delete nod;
        return true;
    }
    return false;
}
void trie_insert(trie *nod, char *str) {
    while(*str!='\n') {
        vector<pair<char, trie*> >::iterator it;
        for(it=nod->next.begin(); it!=nod->next.end(); ++it)
            if(it->first==*str)
                break;
        if(it==nod->next.end()) {
            nod->next.push_back(make_pair(*str, new trie));
            nod->children++;
            nod=nod->next.back().second;
        }
        else
            nod=it->second;
        str++;
    }
    nod->number++;
}

int main() {
    start = new trie;
    char str[32];
    while(fgets(str, 32, si)) {
        switch(str[0]) {
            case '0': trie_insert(start, str+2); break;
            case '1': trie_delete(start, str+2); break;
            case '2': fprintf(so, "%i\n", trie_count(start, str+2)); break;
            case '3': fprintf(so, "%i\n", trie_prefix(start, str+2)); break;
            default: return 0;
        }
    }
    return 0;
}