Pagini recente » Cod sursa (job #821016) | Cod sursa (job #94028) | Cod sursa (job #3144224)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char line[26];
struct Trie
{
int cnt, nrfii;
Trie *fii[26];
Trie()
{
cnt = nrfii = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *T = new Trie;
void ad(Trie *nod, char *s)
{
if(s[0] == 0)
{
nod->cnt ++;
return;
}
else if(nod->fii[ s[0] - 'a' ] == 0)
{
nod->nrfii ++;
Trie *p = new Trie;
nod->fii[ s[0] - 'a' ] = p;
}
ad(nod->fii[ s[0] - 'a' ], s + 1);
}
int del(Trie *nod, char *s)
{
if(s[0] == 0)
nod->cnt --;
else if(del(nod->fii[ s[0] - 'a' ], s + 1) != 0)
{
nod->nrfii --;
nod->fii[ s[0] - 'a' ] = 0;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int ap(Trie *nod, char *s)
{
if(s[0] == 0)
return nod->cnt;
if(nod->fii[ s[0] - 'a' ] == 0)
return 0;
return ap(nod->fii[ s[0] - 'a' ], s + 1);
}
int pref(Trie *nod, char *s, int k)
{
if(s[0] == 0 || nod->fii[ s[0] - 'a' ] == 0)
return k;
return pref(nod->fii[ s[0] - 'a' ], s + 1, k + 1);
}
int main()
{
while(f.getline(line, 26))
{
int op = line[0] - '0';
if(op == 0)
ad(T, line + 2);
else if(op == 1)
del(T, line + 2);
else if(op == 2)
g << ap(T, line + 2) << '\n';
else g << pref(T, line + 2, 0) << '\n';
}
return 0;
}