Pagini recente » Cod sursa (job #377978) | Cod sursa (job #769808) | Cod sursa (job #178291) | Cod sursa (job #507060) | Cod sursa (job #1314275)
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
class trie
{
public:
void insert(char cuv[20])
{
node *nod=rad;
int lim=strlen(cuv);
for(int i=0;i<lim;i++)
{
nod->nr++;
if(nod->fiu.count(cuv[i])==0)
nod->fiu[cuv[i]]=new node();
nod=nod->fiu[cuv[i]];
}
nod->nr++;
nod->nrterm++;
}
void erase(char cuv[20])
{
erase(rad,cuv,0);
}
int count(char cuv[20])
{
node *nod=rad;
int lim=strlen(cuv);
for(int i=0;i<lim;i++)
{
if(nod->fiu.count(cuv[i])==0) return 0;
nod=nod->fiu[cuv[i]];
}
return nod->nrterm;
}
int prefix(char cuv[20])
{
node *nod=rad;
int lim=strlen(cuv),i=0;
for(;i<lim;i++)
{
if(nod->fiu.count(cuv[i])==0) break;
nod=nod->fiu[cuv[i]];
}
return i;
}
private:
class node
{
public:
int nr,nrterm;
map<char,node*> fiu;
node():
nr(0),
nrterm(0),
fiu(map<char,node*>()) {}
};
node *rad=new node();
void erase(node *nod,char cuv[20],int i)
{
nod->nr--;
if(i==strlen(cuv))
{
nod->nrterm--;
return;
}
erase(nod->fiu[cuv[i]],cuv,i+1);
if(nod->fiu[cuv[i]]->nr==0)
{
delete nod->fiu[cuv[i]];
nod->fiu.erase(nod->fiu.find(cuv[i]));
}
}
};
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int tip;
char cuv[20];
trie v;
while(!feof(stdin))
{
scanf("%d %s\n",&tip,cuv);
if(tip==0) v.insert(cuv);
else if(tip==1) v.erase(cuv);
else if(tip==2) printf("%d\n", v.count(cuv));
else printf("%d\n",v.prefix(cuv));
}
return 0;
}