Pagini recente » Cod sursa (job #954416) | Cod sursa (job #2171829) | Cod sursa (job #1348792) | Cod sursa (job #894344) | Cod sursa (job #1643732)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
struct trie
{
int fiu[26],nr,cnt;
}aux;
vector<trie> v;
vector<int> liber;
char sir[25];
int get_new_position()
{
if(liber.size())
{
int a=liber.back();
liber.pop_back();
return a;
}
else
{
v.push_back(aux);
return v.size()-1;
}
}
void trie_add(char sir[])
{
int n=strlen(sir),nod=0;
for(int i=0;i<n;i++)
{
if(!v[nod].fiu[sir[i]-'a'])
{
int a=get_new_position();
v[nod].fiu[sir[i]-'a']=a;
}
nod=v[nod].fiu[sir[i]-'a'];
v[nod].nr++;
}
v[nod].cnt++;
}
void trie_erase(char sir[])
{
int n=strlen(sir),nod=0;
for(int i=0;i<n;i++)
{
int nod1=v[nod].fiu[sir[i]-'a'];
if(--v[nod1].nr==0)
{
v[nod].fiu[sir[i]-'a']=0;
liber.push_back(nod1);
}
nod=nod1;
}
v[nod].cnt--;
}
int trie_count_apparitions(char sir[])
{
int n=strlen(sir),nod=0;
for(int i=0;i<n;i++)
{
if(!v[nod].fiu[sir[i]-'a']) return 0;
nod=v[nod].fiu[sir[i]-'a'];
}
return v[nod].cnt;
}
int trie_longest_prefix(char sir[])
{
int n=strlen(sir),nod=0;
for(int i=0;i<n;i++)
{
if(!v[nod].fiu[sir[i]-'a']) return i;
nod=v[nod].fiu[sir[i]-'a'];
}
return n;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
v.push_back(aux);
while(!feof(stdin))
{
int tip;
scanf("%d %s\n",&tip,sir);
if(tip==0) trie_add(sir);
else if(tip==1) trie_erase(sir);
else if(tip==2) printf("%d\n",trie_count_apparitions(sir));
else printf("%d\n",trie_longest_prefix(sir));
}
return 0;
}