Cod sursa(job #707974)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 6 martie 2012 10:07:43
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <cstring>
using namespace std;
int a[100010][22],cuv[100010],fr[100010],nr,n;
string s;
void adauga(int nod,int p)
{
    if(nod!=1) fr[nod]++;
    if(p==s.size()) {cuv[nod]++; return; }
    if(a[nod][s[p]-'a']) adauga(a[nod][s[p]-'a'],p+1);
    else
    {
        a[nod][s[p]-'a']=++nr;
        adauga(nr,p+1);
    }
}
void sterge(int nod,int p)
{
    if(nod!=1) fr[nod]--;
    if(p==s.size()) cuv[nod]--;
    if(p==s.size()) return;
    if(a[nod][s[p]-'a'])
    {
        sterge(a[nod][s[p]-'a'],p+1);
        if(!fr[a[nod][s[p]-'a']]) a[nod][s[p]-'a']=0;
    }
}
int aparitii(int nod, int p)
{

    if(p==s.size()) return cuv[nod];
    if(a[nod][s[p]-'a']) return aparitii(a[nod][s[p]-'a'],p+1);
    return 0;
}
int prefix(int nod, int p)
{
    if(p==s.size()) return p;
    if(a[nod][s[p]-'a']) return prefix(a[nod][s[p]-'a'],p+1);
    return p;
}
int main()
{
    ifstream fi("trie.in");
    ofstream fo("trie.out");
    nr=1;
    while(fi>>n>>s)
    {
        if(n==0) adauga(1,0);
        if(n==1) sterge(1,0);
        if(n==2) fo<<aparitii(1,0)<<"\n";
        if(n==3) fo<<prefix(1,0)<<"\n";
    }

    return 0;
}