Pagini recente » Cod sursa (job #1180307) | Cod sursa (job #909980) | Cod sursa (job #2810502) | Cod sursa (job #2029467) | Cod sursa (job #2000334)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
map <char,nod*> son;
int number_of_words;
};
nod *root=new nod;
nod *st[25];
int num;
int top;
string s;
string :: iterator it;
map <char,nod*> :: iterator found;
inline void add()
{
nod *sf=root,*p;
for(it=s.begin();it!=s.end();it++)
{
found=sf->son.find(*it);
if(found!=sf->son.end())
{
sf=found->second;
}
else
{
p=new nod;
p->number_of_words=0;
sf->son.insert(pair <char,nod*>(*it,p));
sf=p;
}
}
sf->number_of_words++;
}
inline void del()
{
nod *sf=root;
top=0;
for(it=s.begin();it!=s.end();it++)
{
found=sf->son.find(*it);
if(found==sf->son.end());// g<<"error at "<<num;
else
{
st[++top]=sf;
sf=found->second;
}
}
it=s.end();
--it;
sf->number_of_words--;
while(sf->son.empty())
{
delete sf;
sf=st[top--];
sf->son.erase(sf->son.find(*it));
it--;
}
}
inline int number_of_aparances()
{
nod *sf=root;
for(it=s.begin();it!=s.end();it++)
{
found=sf->son.find(*it);
if(found==sf->son.end()) return 0;
else sf=found->second;
}
return sf->number_of_words;
}
inline int number_of_prefixes()
{
int nr=0;
nod *sf=root;
for(it=s.begin();it!=s.end();it++)
{
found=sf->son.find(*it);
if(found==sf->son.end())
return nr;
else
{
sf=found->second;
nr++;
}
}
return nr;
}
int main()
{
int op;
root->son.insert(pair <char,nod*> ('1',NULL));
while(f>>op>>s)
{
++num;
switch (op)
{
case 0:
add();
break;
case 1:
del();
break;
case 2:
g<<number_of_aparances()<<'\n';
break;
case 3:
g<<number_of_prefixes()<<'\n';
break;
}
}
return 0;
}