Pagini recente » Cod sursa (job #1617598) | Cod sursa (job #1103898) | Cod sursa (job #2697546) | Cod sursa (job #1284320) | Cod sursa (job #2857175)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int val,nrf;
trie *fiu[27];
trie()
{
val=nrf=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *t=new trie;
void update(trie *x,char c[],int k)
{
if(k==strlen(c))
{
x->val++;
return;
}
char ch=c[k]-'a';
if(x->fiu[ch]==0)
{
x->fiu[ch]=new trie;
x->nrf++;
}
update(x->fiu[ch],c,k+1);
}
bool delte(trie *x,char c[],int k)
{
char ch=c[k]-'a';
if(k==strlen(c))
x->val--;
else
if(delte(x->fiu[ch],c,k+1)==1)
{
x->fiu[ch]=0;
x->nrf--;
}
if(x->val==0 && x->nrf==0 && x!=t)
{
delete x;
return 1;
}
return 0;
}
int howmany(trie *x,char c[],int k)
{
if(k==strlen(c))
return x->val;
char ch=c[k]-'a';
if(x->fiu[ch]==0)
return 0;
return howmany(x->fiu[ch],c,k+1);
}
int prefix(trie *x,char c[],int k)
{
char ch=c[k]-'a';
if(k==strlen(c) || x->fiu[ch]==0)
return k;
return prefix(x->fiu[ch],c,k+1);
}
int x;
char c[30];
int main()
{
while(f>>x)
{
f>>c;
if(x==0)
update(t,c,0);
if(x==1)
delte(t,c,0);
if(x==2)
g<<howmany(t,c,0)<<'\n';
if(x==3)
g<<prefix(t,c,0)<<'\n';
}
return 0;
}