Pagini recente » Cod sursa (job #1886562) | Cod sursa (job #1530862) | Cod sursa (job #2722901) | Cod sursa (job #1108881) | Cod sursa (job #2482410)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int x;
string s;
struct trie
{
trie* c[27];
int nrp, nre;
}node;
trie* create()
{
trie *x=new trie;
x->nre=0;
x->nrp=0;
for(int i=0;i<=26;++i) x->c[i]=NULL;
return x;
}
void baga(trie *root, string s)
{
trie *p=root;
for(int i=0;i<s.size();i++)
{
int index=s[i]-'a';
if(!p->c[index]) p->c[index]=create();
p->nrp++;
p=p->c[index];
}
p->nrp++;
p->nre++;
}
int cauta(trie *root, string s)
{
trie *p=root;
for(int i=0;i<s.size();++i)
{
int index=s[i]-'a';
if(!p->c[index]) return 0;
p=p->c[index];
}
return p->nre;
}
int cauta3(trie *root, string x)
{
trie *p=root;
int i;
for(i=0;i<s.size()&&(p->nrp>1);++i)
{
int index=s[i]-'a';
if(!p->c[index]) return i;
p=p->c[index];
}
return i;
}
void scoate(trie *root, string s, int depth)
{
if(depth==s.size())
{
root->nre--;
root->nrp--;
if(root->nrp==0) delete root, root=NULL;
}
else
{
int index=s[depth]-'a';
scoate(root->c[index], s, depth+1);
root->nrp--;
if(root->nrp==0) delete root, root=NULL;
}
}
int main()
{
trie *node=create();
while(fin>>x)
{
fin>>s;
if(x==0)
{
baga(node, s);
}
else if(x==1)
{
scoate(node, s, 0);
}
else if(x==2)
{
fout<<cauta(node, s)<<"\n";
}
else
{
fout<<cauta3(node, s)<<"\n";
}
}
return 0;
}