Pagini recente » Cod sursa (job #1804593) | Cod sursa (job #262350) | Cod sursa (job #2009799) | Cod sursa (job #666978) | Cod sursa (job #858550)
Cod sursa(job #858550)
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#define pb push_back
#define mp make_pair
#define un unsigned
using namespace std;
string x;
vector<pair<char,int> > list[120005];
int trie[120005],sz=1,exist[120005];
void insert(string x)
{
int nod=1;
bool gasit;
for(un int i=0;i<x.size();++i)
{
gasit=false;
for(un int j=0;j<list[nod].size();++j)
if(list[nod][j].first==x[i])
{
nod=list[nod][j].second;
gasit=true;
break;
}
if(gasit==false)
{
list[nod].pb(mp(x[i],++sz));
nod=sz;
}
++exist[nod];
}
++trie[nod];
}
void erase(string x)
{
int nod=1;
for(un int i=0;i<x.size();++i)
{
for(un int j=0;j<list[nod].size();++j)
if(list[nod][j].first==x[i])
{
nod=list[nod][j].second;
break;
}
--exist[nod];
}
--trie[nod];
}
int search(string x)
{
int nod=1;
bool gasit;
for(un int i=0;i<x.size();++i)
{
gasit=false;
for(un int j=0;j<list[nod].size();++j)
if(list[nod][j].first==x[i])
{
nod=list[nod][j].second;
gasit=true;
break;
}
if(gasit==false)
return 0;
}
return trie[nod];
}
int find(string x)
{
int nod=1,adancime=0,maxim=0;
bool gasit;
for(un int i=0;i<x.size();++i)
{
gasit=false;
for(un int j=0;j<list[nod].size();++j)
if(list[nod][j].first==x[i])
{
nod=list[nod][j].second;
gasit=true;
break;
}
if(gasit==false)
return maxim;
else
++adancime;
if(exist[nod])
{
//cout<<" WHY ?";
maxim=max(maxim,adancime);
}
}
return maxim;
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
while(getline(f,x))
{
int op=x[0]-'0';
x.erase(x.begin(),x.begin()+2); //
// cout<<x<<endl;
///
if(op==0)
insert(x);
if(op==1)
erase(x);
if(op==2)
g<<search(x)<<"\n";
if(op==3)
g<<find(x)<<"\n";
}
return 0;
}