Cod sursa(job #3250994)

Utilizator ccccCic cec cccc Data 24 octombrie 2024 14:45:39
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod {
    int info, nrcuvinte;
    nod* v[26];
    nod() {
        nrcuvinte=0;
        info=0;
        for (int i=0; i<=25; i++) v[i]=0;
    }
};
nod* start=new nod();
void nraparitii(string s) {
    nod* curent=start;
    int n=s.size();
    for (int i=0; i<n; i++) {
        if (curent->v[s[i]-'a']!=0) {
            curent=curent->v[s[i]-'a'];
        }
        else {
            fout<<0<<'\n';
            return ;
        }
    }
    fout<<curent->nrcuvinte<<'\n';
}
void adauga(string s) {
    nod* curent=start;
    int n=s.size();
    for (int i=0; i<n; i++) {
        if (curent->v[s[i]-'a']==0) {
            nod* urmator=new nod();
            curent->v[s[i]-'a']=urmator;
        }
        curent=curent->v[s[i]-'a'];
        curent->info++;
    }
    curent->nrcuvinte++;
}
void sterge(string s) {
    nod* curent=start;
    int n=s.size();
    for (int i=0; i<n; i++) {
        curent=curent->v[s[i]-'a'];
        curent->info--;
    }
    curent->nrcuvinte--;
}
void prefix(string s) {
    nod* curent=start;
    int n=s.size();
    for (int i=0; i<n; i++) {
        if (curent->v[s[i]-'a']!=0) {
                if(curent->v[s[i]-'a']->info>0)
                    curent=curent->v[s[i]-'a'];
                else {
                    fout<<i<<'\n';
                    return ;
                }
        }
        else {
            fout<<i<<'\n';
            return ;
        }
    }
    fout<<n<<'\n';
}
int main()
{
    int x;
    string s;
    while (fin>>x>>s) {
        if (x==0) adauga(s);
        if (x==1) sterge(s);
        if (x==2) nraparitii(s);
        if (x==3) prefix(s);
    }
    return 0;
}