Pagini recente » Cod sursa (job #1960956) | Cod sursa (job #2640193) | Cod sursa (job #706283) | Cod sursa (job #2978823) | Cod sursa (job #2739504)
#include <fstream>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct trie
{
int cnt;
int nrf;
trie* adj[26];
};
trie* myTrie=new trie();
void add (trie* nod, char* s)
{
if(s[0]==NULL)
{
++nod->cnt;
return;
}
if(nod->adj[s[0]-'a']==NULL)
{
++nod->nrf;
nod->adj[s[0]-'a']=new trie();
}
add(nod->adj[s[0]-'a'],s+1);
}
bool remove (trie* nod, char* s)
{
if(s[0]==NULL)
--nod->cnt;
else if(remove(nod->adj[s[0]-'a'],s+1))
{
--nod->nrf;
nod->adj[s[0]-'a']=0;
}
if(nod!=myTrie && nod->cnt==0 && nod->nrf==0)
{
delete nod;
return 1;
}
return 0;
}
int find (trie* nod, char* s)
{
if(s[0]==NULL)
return nod->cnt;
if(nod->adj[s[0]-'a']==NULL)
return 0;
return find(nod->adj[s[0]-'a'],s+1);
}
int maxpref (trie* nod, char* s)
{
if(s[0]==NULL)
return 0;
if(nod->adj[s[0]-'a']==NULL)
return 0;
return 1+maxpref(nod->adj[s[0]-'a'],s+1);
}
char v[30];
int main()
{
int a;
while(cin>>a)
{
cin>>v;
if(a==0)
add(myTrie,v);
if(a==1)
remove(myTrie,v);
if(a==2)
cout<<find(myTrie,v)<<'\n';
if(a==3)
cout<<maxpref(myTrie,v)<<'\n';
}
return 0;
}