Pagini recente » Cod sursa (job #3165681) | Cod sursa (job #1912300) | Cod sursa (job #912801) | Cod sursa (job #2079903) | Cod sursa (job #2700149)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct Trie
{
int nrfii, cnt;
Trie *fii[26];
Trie()
{
cnt=nrfii=0;
memset(fii, 0, sizeof(fii));
}
};
Trie *T=new Trie;
void add(Trie *nod, char *s)
{
if(*s=='\0')
{
nod->cnt++;
return;
}
if(nod->fii[*s-'a']==0)
{
nod->fii[*s-'a']=new Trie;
nod->nrfii++;
}
add(nod->fii[*s-'a'], s+1);
}
int del(Trie *nod, char *s)
{
if(*s=='\0') nod->cnt--;
else if(del(nod->fii[*s-'a'], s+1))
{
nod->fii[*s-'a']=0;
nod->nrfii--;
}
if(nod->nrfii==0&&nod->cnt==0&&nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie *nod, char *s)
{
if(*s=='\0') return nod->cnt;
if(nod->fii[*s-'a']) return aparitii(nod->fii[*s-'a'], s+1);
return 0;
}
int lungimePrefix(Trie *nod, char *s, int k)
{
if(*s=='\0' || nod->fii[*s-'a']==0) return k;
return lungimePrefix(nod->fii[*s-'a'], s+1, k+1);
}
char line[23];
int main()
{
while(fin.getline(line, 23))
{
switch(line[0])
{
case '0':
add(T, line+2);
break;
case '1':
del(T, line+2);
break;
case '2':
fout<<aparitii(T, line+2)<<"\n";
break;
case '3':
fout<<lungimePrefix(T, line+2, 0)<<"\n";
break;
}
}
}