Pagini recente » Profil byndrsn | Cod sursa (job #2460946) | Diferente pentru autumn-warmup-2007/solutii/runda-2 intre reviziile 21 si 20 | Cod sursa (job #534832) | Cod sursa (job #1998910)
#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;
list <nod*> st;
string s;
string :: iterator it;
map <char,nod*> :: iterator found;
// const string
inline void add(string s)
{
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(string s)
{
st.clear();
nod *sf=root;
for(it=s.begin();it!=s.end();it++)
{
found=sf->son.find(*it);
st.push_back(sf);
sf=found->second;
}
sf->number_of_words--;
it=--s.end();
while(sf->son.empty() and it!=s.begin())
{
delete sf;
sf=st.back();
st.pop_back();
sf->son.erase(sf->son.find(*it));
it--;
}
}
inline int number_of_aparances(string s)
{
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(string s)
{
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;
while(f>>op>>s)
switch (op)
{
case 0:
add(s);
break;
case 1:
del(s);
break;
case 2:
g<<number_of_aparances(s)<<'\n';
break;
case 3:
g<<number_of_prefixes(s)<<'\n';
break;
}
return 0;
}