Pagini recente » Cod sursa (job #2250168) | Cod sursa (job #1786670) | Cod sursa (job #779976) | Cod sursa (job #2498981) | Cod sursa (job #2331818)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int type;
char word[30];
struct Trie
{
int cnt,nrfii;
Trie* Edges[26];
Trie()
{
nrfii=cnt=0;
memset(Edges,0,sizeof(Edges));
}
};
Trie* T=new Trie;
void Insert(Trie *nod,int lit,int lg)
{
if(lit==lg)
{
nod->cnt++;
return;
}
if(nod->Edges[word[lit]-'a']==0)
{
nod->Edges[word[lit]-'a']=new Trie;
nod->nrfii++;
}
Insert(nod->Edges[word[lit]-'a'],lit+1,lg);
}
bool Delete(Trie *nod,int lit,int lg)
{
if(lit==lg)
nod->cnt--;
else
if(Delete(nod->Edges[word[lit]-'a'],lit+1,lg))
{
nod->nrfii--;
nod->Edges[word[lit]-'a']=0;
}
if(nod!=T&&nod->nrfii==0&&nod->cnt==0)
{
delete nod;
return 1;
}
return 0;
}
int NRWORDS(Trie *nod,int lit,int lg)
{
if(lit==lg) return nod->cnt;
if(nod->Edges[word[lit]-'a'])
return NRWORDS(nod->Edges[word[lit]-'a'],lit+1,lg);
return 0;
}
int prefix(Trie *nod,int lit,int ans,int lg)
{
if(lit==lg||nod->Edges[word[lit]-'a']==0)
return ans;
if(nod->Edges[word[lit]-'a'])
return prefix(nod->Edges[word[lit]-'a'],lit+1,ans+1,lg);
}
int main()
{
while(f>>type)
{
f>>word;
if(type==0) Insert(T,0,strlen(word));
else
if(type==1) Delete(T,0,strlen(word));
else
if(type==2) g<<NRWORDS(T,0,strlen(word))<<'\n';
else
if(type==3)
g<<prefix(T,0,0,strlen(word))<<'\n';
}
return 0;
}