Pagini recente » Cod sursa (job #2135610) | Cod sursa (job #2702897) | Cod sursa (job #1588272) | Cod sursa (job #3133761) | Cod sursa (job #1411441)
#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,*next;
for(int i=0;i<n;++i)
{
int poz = cuv[i]-'a';
crt->nrfii--;
next = crt->T[poz];
if(crt->nrfii == 0) delete crt;
crt = next;
}
crt->ap--;
}
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;
}