Pagini recente » Cod sursa (job #1739790) | Cod sursa (job #1214260) | Cod sursa (job #2372975) | Cod sursa (job #2359859) | Cod sursa (job #2636772)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
char c;
int nrcuv,nrfii;
trie *v[27];
trie()
{
for(int i=0; i<27; ++i)
v[i]=NULL;
nrcuv=0;
nrfii=0;
}
};
trie *prim;
void Insert(string s)
{
trie *t=prim;
for(int p=0; p<(int)s.size(); p++)
{
if(t->v[s[p]-'a'+1]!=NULL)
{
t=t->v[s[p]-'a'+1];
}
else
{
trie *t2=new trie;
t->v[s[p]-'a'+1]=t2;
t->nrfii++;
t2->c=s[p];
t=t2;
}
}
t->nrcuv++;
}
bool Delete(string s,trie *t,int p)
{
if(p==s.size())
{
if(t->nrfii==0&&t->nrcuv==1)
{
delete t;
return true;
}
else if(t->nrfii==0)
{
t->nrcuv--;
return false;
}
return false;
}
if(Delete(s,t->v[s[p]-'a'+1],p+1))
{
t->nrfii--;
t->v[s[p]-'a'+1]=NULL;
}
if(t->nrfii==0&&t!=prim)
{
delete t;
return true;
}
return false;
}
void nrap(string s)
{
trie *t=new trie;
t=prim;
for(int p=0; p<(int)s.size(); p++)
{
if(t->v[s[p]-'a'+1]!=NULL)
{
t=t->v[s[p]-'a'+1];
}
else
{
fout<<0<<"\n";
return;
}
}
fout<<t->nrcuv<<"\n";
}
void prefcom(string s)
{
trie *t=prim;
int cnt=0;
for(int p=0; p<(int)s.size(); p++)
{
if(t->v[s[p]-'a'+1]!=NULL)
{
t=t->v[s[p]-'a'+1];
cnt++;
}
else break;
}
fout<<cnt<<"\n";
}
int main()
{
string s;
int op;
prim=new trie;
while(fin>>op>>s)
{
if(op==0)
Insert(s);
else if(op==1)
Delete(s,prim,0);
else if(op==2)
nrap(s);
else prefcom(s);
}
}