Pagini recente » Cod sursa (job #1246842) | Cod sursa (job #1085467) | Cod sursa (job #624120) | Cod sursa (job #169506) | Cod sursa (job #804672)
Cod sursa(job #804672)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie{
int cnt;
int nrfii;
Trie *fiu[26];
Trie(){
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
} *T = new Trie;
void add(Trie *nod, char *w)
{
if(*w == '\n')
{
nod->cnt++;
return;
}
if(nod->fiu[*w - 'a'] == 0)
{
nod->fiu[*w - 'a'] = new Trie;
nod->nrfii++;
}
add(nod->fiu[*w - 'a'], w + 1);
}
int sterge(Trie *nod, char *w)
{
if(*w == '\n')
{
nod->cnt--;
}
else
if(sterge( nod->fiu[*w - 'a'], w + 1) == 1)
{
nod->fiu[*w - 'a'] = 0;
nod->nrfii--;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int count(Trie *nod, char *w)
{
if(*w == '\n')
return nod->cnt;
else
if(nod->fiu[*w - 'a'])
return count(nod->fiu[*w - 'a'], w + 1);
else return 0;
}
int prefix(Trie *nod, char *w, int k)
{
if(*w == '\n' || nod->fiu[*w - 'a'] == 0)
return k;
return prefix(nod->fiu[*w - 'a'], w + 1, k + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int nr;
char sir[32];
while( !feof(stdin) ) {
fgets( sir , 32 , stdin);
if(feof(stdin)) continue;
if( sir[0] == '0')
add(T, sir + 2);
if( sir[0] == '1')
sterge(T, sir + 2);
if( sir[0] == '2')
printf("%d\n",count(T, sir + 2));
if( sir[0] == '3' )
printf("%d\n",prefix(T ,sir + 2 , 0));
}
return 0;
}