Pagini recente » Cod sursa (job #1459967) | Cod sursa (job #2298765) | Cod sursa (job #1239206) | Cod sursa (job #1763077) | Cod sursa (job #1411427)
#include <fstream>
#include <cstring>
using namespace std;
#define sigma 26
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int ap,nrfii;
trie *T[sigma];
trie()
{
ap = nrfii = 0;
for(int i=0;i<sigma;++i) T[i] = NULL;
};
} *root = new trie;
void adauga(char cuv[])
{
int n = strlen(cuv);
trie *crt = root;
for(int i=0;i<n;++i)
{
int poz = cuv[i]-'a';
if(crt->T[poz] == NULL) crt->T[poz] = new trie;
crt->nrfii++;
crt = crt->T[poz];
}
crt->ap++;
}
void sterge(char cuv[])
{
int n = strlen(cuv);
trie *crt = root;
trie *ant;
for(int i=0;i<n;++i)
{
int poz = cuv[i]-'a';
crt->nrfii--;
ant = crt;
crt = crt->T[poz];
if(!ant->nrfii) delete ant;
}
crt->ap--;
if(!crt->nrfii && !crt->ap) delete crt;
}
int apar(char cuv[])
{
int n = strlen(cuv);
trie *crt = root;
for(int i=0;i<n;++i)
{
int poz = cuv[i]-'a';
if(crt->T[poz] == NULL) return 0;
crt = crt->T[poz];
}
return crt->ap;
}
int pref(char cuv[])
{
int n = strlen(cuv);
trie *crt = root;
for(int i=0;i<n;++i)
{
int poz = cuv[i]-'a';
if(crt->T[poz] == NULL || crt->nrfii == 0)
{
if(crt->ap || crt->nrfii) return i;
else return i-1;
}
crt = crt->T[poz];
}
return n;
}
int main()
{
int op;
char cuv[sigma];
while(f>>op>>cuv)
{
if(op == 0) adauga(cuv);
if(op == 1) sterge(cuv);
if(op == 2) g<<apar(cuv)<<"\n";
if(op == 3) g<<pref(cuv)<<"\n";
}
f.close();
g.close();
return 0;
}