Pagini recente » Cod sursa (job #240305) | Cod sursa (job #1152742) | Cod sursa (job #3211227) | Cod sursa (job #2805393) | Cod sursa (job #1816870)
#include <bits/stdc++.h>
#define Sigma 26
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int fii, nr_cuv;
Trie *next[Sigma];
Trie():fii(0),nr_cuv(0)
{
memset(next, 0, sizeof(next));
}
} *T = new Trie;
void add(Trie *start,char *s)
{
if(*s==NULL)
{
start->nr_cuv++;
return;
}
if(start->next[*s-'a']==NULL)
{
start->next[*s-'a']=new Trie;
start->fii++;
}
add(start->next[*s-'a'],s+1);
}
bool del(Trie *start,char *s)
{
if(*s=='\0')
start->nr_cuv--;
else
if(del(start->next[*s-'a'],s+1))
start->next[*s-'a']=0;
if(start->nr_cuv==0 && start->fii==0 && start!=T)
{
delete start;
return true;
}
return false;
}
int Count(Trie *start,char *s)
{
if(*s=='\0')
return start->nr_cuv;
if(start->next[*s-'a'])
return Count(start->next[*s-'a'],s+1);
return 0;
}
int CountPrefix(Trie *start,char *s,int contor)
{
if(*s=='\0' || !start->next[*s-'a'])
return contor;
return CountPrefix(start->next[*s-'a'],s+1,contor+1);
}
char cuv[1<<5],op;
int main()
{
while(fin>>op>>cuv)
{
switch(op)
{
case '0':add(T,cuv);break;
case '1':del(T,cuv);break;
case '2':fout<<Count(T,cuv)<<"\n";break;
case '3':fout<<CountPrefix(T,cuv,0)<<"\n";break;
}
}
}