Pagini recente » Cod sursa (job #262235) | Cod sursa (job #1106334) | Cod sursa (job #639943) | Cod sursa (job #1208378) | Cod sursa (job #2998865)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int val,nrfii;
trie* fiu[26];
trie()
{
val=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie* T=new trie();
void trie_push(trie* t,char c[],int k)
{
if(k==strlen(c))
{
t->val++;
return;
}
int x=c[k]-'a';
if(t->fiu[x]==0)
{
t->fiu[x]=new trie();
t->nrfii++;
}
trie_push(t->fiu[x],c,k+1);
}
bool trie_delete(trie* t,char c[],int k)
{
if(k==strlen(c))
t->val--;
else
{
int x=c[k]-'a';
if(trie_delete(t->fiu[x],c,k+1))
{
t->nrfii--;
t->fiu[x]=0;
}
}
if(t->val==0 && t->nrfii==0 && t!=T)
{
delete t;
return 1;
}
return 0;
}
void trie_query(trie* t,char c[],int k)
{
if(k==strlen(c))
{
g<<t->val<<'\n';
return;
}
int x=c[k]-'a';
if(t->fiu[x]==NULL)
{
g<<'0'<<'\n';
return;
}
trie_query(t->fiu[x],c,k+1);
}
int M;
void trie_prefix(trie *t,char c[],int k)
{
if(k==strlen(c))
{
g<<k<<'\n';
return;
}
int x=c[k]-'a';
if(t->fiu[x]==0)
{
g<<k<<'\n';
return;
}
trie_prefix(t->fiu[x],c,k+1);
}
int C;
char c[21];
int main()
{
while(f>>C>>c)
{
if(C==0)
trie_push(T,c,0);
else
if(C==1)
trie_delete(T,c,0);
else
if(C==2)
trie_query(T,c,0);
else
{
M=0;
trie_prefix(T,c,0);
}
}
return 0;
}