Pagini recente » Cod sursa (job #567001) | Cod sursa (job #2818810) | Cod sursa (job #1602222) | Cod sursa (job #795132) | Cod sursa (job #429514)
Cod sursa(job #429514)
#include<fstream>
#include<string>
using namespace std;
int op,T,N,cont;
char cuv[30];
struct Trie
{
int inf;
Trie *fiu[30];
} *R,*p;
void add ()
{
int i,j,c;
p=R;
Trie *nod;
for(i=0;i<N-1;i++)
{
c=(int)(cuv[i]-'a');
if(p->fiu[c]) p=p->fiu[c];
else
{
nod=new Trie;
nod->inf=0;
for(j=0;j<26;j++)
nod->fiu[j]=NULL;
p->fiu[c]=nod;
p=nod;
}
}
c=(int)(cuv[i]-'a');
if(p->fiu[c]) { p=p->fiu[c]; p->inf++;}
else
{
nod=new Trie;
nod->inf=1;
for(j=0;j<26;j++)
nod->fiu[j]=NULL;
p->fiu[c]=nod;
}
}
void sterge ( Trie *&nod,int i )
{
if(!cont) return;
if(i==N)
{
nod->inf--;
if(nod->inf==0)
{
delete nod;
nod=NULL;
}
return;
}
int c=(int)(cuv[i]-'a');
sterge(nod->fiu[c],i+1);
if(!cont) return ;
if(nod->inf==0)
{
for(int j=0;j<26&&cont;j++)
if(nod->fiu[j]) cont=0;
if(cont)
{
delete nod;
nod=NULL;
}
}
}
void del ()
{
p=R;
cont=1;
sterge(p,0);
}
int find ()
{
p=R;
int i,c;
for(i=0;i<N;i++)
{
c=(int)(cuv[i]-'a');
p=p->fiu[c];
}
return p->inf;
}
int query ()
{
p=R;
int i,c,sol=0;
for(i=0;i<N;i++)
{
c=(int)(cuv[i]-'a');
if(p->fiu[c])
{
p=p->fiu[c];
sol=i+1;
}
else break;
}
return sol;
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
R=new Trie;
R->inf=0;
for(int i=0;i<26;i++)
R->fiu[i]=NULL;
while(!f.eof())
{
f>>op>>cuv;
N=strlen(cuv);
switch(op)
{
case 0: add(); break;
case 1: del(); break;
case 2: g<<find()<<'\n'; break;
case 3: g<<query()<<'\n'; break;
}
if(f.eof()) break;
}
f.close();
g.close();
return 0;
}