Pagini recente » Cod sursa (job #616386) | Cod sursa (job #1130918) | Cod sursa (job #2068884) | Cod sursa (job #408700) | Cod sursa (job #1978030)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
int nap,nedges;
Trie* edges[26];
Trie()
{
nap=nedges=0;
memset(edges,0,sizeof(edges));
}
};
int t; string str;
void inserare(Trie* tmp)
{
for(int i=0; i<str.length(); i++)
{
if(!tmp->edges[str[i]-'a'])
{
tmp->edges[str[i]-'a']=new Trie;
tmp=tmp->edges[str[i]-'a'];
}
else tmp=tmp->edges[str[i]-'a'];
(tmp->nedges)++;
}
(tmp->nap)++;
}
void stergere(Trie* tmp)
{
for(int i=0; i<str.length(); i++)
{
tmp=tmp->edges[str[i]-'a'];
--(tmp->nedges);
}
(tmp->nap)--;
}
int aparitii(Trie* tmp)
{
for(int i=0; i<str.length(); i++)
{
if(!tmp->edges[str[i]-'a']) return 0;
tmp=tmp->edges[str[i]-'a'];
}
return tmp->nap;
}
int prefix(Trie* tmp)
{
for(int i=0; i<str.length(); i++)
{
if((!tmp->edges[str[i]-'a']) || (!tmp->edges[str[i]-'a']->nedges))
return i;
tmp=tmp->edges[str[i]-'a'];
}
return str.length();
}
int main()
{
Trie* root= new Trie;
while(in>>t>>str)
{
switch(t)
{
case 0: inserare(root); break;
case 1: stergere(root); break;
case 2: out<<aparitii(root)<<'\n'; break;
case 3: out<<prefix(root)<<'\n'; break;
}
}
return 0;
}