Pagini recente » Cod sursa (job #658373) | Cod sursa (job #2953482) | Cod sursa (job #2839473) | Cod sursa (job #847582) | Cod sursa (job #809772)
Cod sursa(job #809772)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
inline int maxim(int a,int b){if(a>b)return a;return b;}
struct trie
{
int cont,nrfii;
trie *fiu[27];
trie()
{
cont = nrfii = 0;
for(int i=0;i<27;i++)
fiu[i] = NULL;
}
} *Trie;
void Insert(trie *Root,char cuv[],int p)
{
if(p == strlen(cuv))
{
Root->cont++ ;
return;
}
if(Root->fiu[ cuv[p] - 'a' ] == NULL)
Root->fiu[ cuv[p] - 'a' ] = new trie,Root->nrfii ++;
Insert(Root->fiu[ cuv[p] - 'a'], cuv, p+1);
}
int Query(trie *Root,char cuv[], int p)
{
if(Root==NULL)return 0;
if(p==strlen(cuv))
{
return Root->cont;
}
return Query(Root->fiu[ cuv[p] - 'a' ],cuv, p+1);
}
bool Erase(trie *Root, char cuv[], int p)
{
if(p == strlen(cuv))
Root->cont-- ;
else if(Erase(Root->fiu[ cuv[p] - 'a' ],cuv,p+1))
Root->fiu[ cuv[p] - 'a' ] = NULL, Root->nrfii--;
if(!Root->cont && !Root->nrfii)
{
delete Root;
return 1;
}
return 0;
}
int Prefix(trie *Root, char cuv[], int p)
{
if(p == strlen(cuv) || Root->fiu[ cuv[p] - 'a'] == NULL )
return p;
else return Prefix(Root->fiu[ cuv[p] - 'a'],cuv,p+1);
}
int main()
{
int op;
char cuvant[24];
Trie = new trie;
while(in>>op>>cuvant)
{
if(op == 0)
Insert(Trie,cuvant,0);
if(op == 1)
Erase(Trie,cuvant,0);
if(op ==2)
out<<Query(Trie,cuvant,0)<<'\n';
if(op == 3)
out<<Prefix(Trie,cuvant,0)<<'\n';
}
return 0;
}