Pagini recente » Cod sursa (job #2736281) | Cod sursa (job #1822504) | Cod sursa (job #2704065) | Cod sursa (job #2354317) | Cod sursa (job #2632177)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int x;
class nod{
public:
int nrfii,occ;
nod *p[26];
nod()
{
occ=nrfii=0;
memset(p,0,sizeof(p));
}
};
void Add(nod* root,string word,int k)
{
if(k==word.size())
{
root->occ++;
return;
}
int idx=word[k]-'a';
if( root->p[idx] == NULL )
{
root->nrfii++;
nod* vertex=new nod;
root->p[idx]=vertex;
}
Add(root->p[idx],word,k+1);
}
nod* T;
bool Erase(nod* root,string word,int k)
{
if(k==word.size()) root->occ--;
else
{
int idx=word[k]-'a';
if(Erase(root->p[idx],word,k+1))
{
root->nrfii--;
root->p[idx]=0;
}
}
if( root!=T && !root->nrfii && !root->occ )
{
delete root;
return 1;
}
return 0;
}
int Prefix(nod* root,string word,int k)
{
if(k==word.size()) return 0;
int idx=word[k]-'a';
if( root->p[idx] ) return 1+Prefix(root->p[idx],word,k+1);
else return 0;
}
int Occurances(nod* root,string word,int k)
{
if(k==word.size()) return root->occ;
int idx=word[k]-'a';
if( root->p[idx] ) return Occurances(root->p[idx],word,k+1);
else return 0;
}
int main()
{
nod* root=new nod;
T=root;
string S;
while(f>>x>>S)
{
if(x==0) Add(root,S,0);
else
if(x==1) Erase(root,S,0);
else
if(x==2) g<<Occurances(root,S,0)<<'\n';
else
g<<Prefix(root,S,0)<<'\n';
}
return 0;
}