Pagini recente » Cod sursa (job #216202) | Cod sursa (job #301471) | Cod sursa (job #1983303) | Cod sursa (job #26916) | Cod sursa (job #2772744)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int fii, nr;
trie* F[26];
trie()
{
fii = nr = 0;
for(int i = 0; i < 26; i++)
F[i] = 0;
}
};
trie* rad = new trie;
int ops;
char s[25];
void adauga(trie* p, char *s)
{
if(*s == 0)
p -> nr++;
else
{
if(!p -> F[*s - 'a'])
{
trie* t = new trie;
p -> F[*s - 'a'] = t;
p -> fii++;
}
adauga(p -> F[*s - 'a'], s + 1);
}
}
bool stergere(trie*& p, char*s)
{
if(*s != 0)
{
if(stergere(p -> F[*s - 'a'], s + 1))
{
p -> fii--;
if(p -> nr == 0 && p -> fii == 0 && p != rad)
{
delete p;
p = 0;
return 1;
}
}
}
else
{
p -> nr--;
if(p -> nr == 0 && p -> fii == 0 && p != rad)
{
delete p;
p = 0;
return 1;
}
}
return 0;
}
int query(trie* p, char* s)
{
if(*s != 0)
{
if(p -> F[*s - 'a'])
return query(p -> F[*s - 'a'], s + 1);
else
return 0;
}
return p -> nr;
}
int prefix(trie* p, char* s)
{
if(*s == 0)
return 0;
if(p -> F[*s - 'a'])
return 1 + prefix(p -> F[*s - 'a'], s + 1);
return 0;
}
int main()
{
while(f >> ops >> s)
{
trie* p = rad;
if(ops == 0)
adauga(p, s);
if(ops == 1)
stergere(p, s);
if(ops == 2)
g << query(p, s) << "\n";
if(ops == 3)
g << prefix(p, s) << "\n";
}
return 0;
}