Pagini recente » Cod sursa (job #326384) | Cod sursa (job #2309515) | Cod sursa (job #663562) | Cod sursa (job #1798600) | Cod sursa (job #3295606)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie{
int cnt, nr_fii;
Trie *fiu[26];
Trie()
{
cnt = nr_fii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T = new Trie;
void Insert(Trie *nod, char *s)
{
if(*s == '\0')
{
nod->cnt++;
return ;
}
if(nod->fiu[*s - 'a'] == 0)
{
Trie *nod2 = new Trie;
nod->fiu[*s - 'a'] = nod2;
nod->nr_fii++;
}
Insert(nod->fiu[*s - 'a'], s + 1);
}
int Delete(Trie *nod, char *s)
{
if(*s == '\0')
nod->cnt--;
else if(Delete(nod->fiu[*s - 'a'], s + 1))
{
nod->nr_fii--;
nod->fiu[*s - 'a'] = 0;
}
if(nod->cnt == 0 && nod->nr_fii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int Query(Trie *nod, char *s)
{
if(*s == '\0')
return nod->cnt;
if(nod->fiu[*s - 'a'] == 0)
return 0;
return Query(nod->fiu[*s - 'a'], s + 1);
}
int Prefix(Trie *nod, char *s, int sol)
{
if(*s == '\0')
return sol;
if(nod->fiu[*s - 'a'] == 0)
return sol;
return Prefix(nod->fiu[*s - 'a'], s + 1, sol + 1);
}
int main()
{
int op;
char ch[25];
while(fin >> op >> ch)
{
switch(op)
{
case 0: Insert(T, ch);break;
case 1: Delete(T, ch);break;
case 2: fout << Query(T, ch) << "\n";break;
case 3: fout << Prefix(T, ch, 0) << "\n";break;
}
}
fout.close();
return 0;
}