Pagini recente » Cod sursa (job #2225367) | Cod sursa (job #2847737) | Cod sursa (job #2201647) | Cod sursa (job #476831) | Cod sursa (job #1920125)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
const int sigma=26;
struct trie
{
int fiu[sigma],nr,s;
trie()
{
nr=s=0;
for(int i=0;i<sigma;i++) fiu[i]=0;
}
};
vector<trie> t;
vector<int> liber;
int new_node()
{
int poz;
if(liber.size())
{
poz=liber.back();
liber.pop_back();
}
else
{
t.push_back(trie());
poz=t.size()-1;
}
return poz;
}
void trie_insert(string sir)
{
int nod=0;
for(int i=0;i<sir.size();i++)
{
if(!t[nod].fiu[sir[i]-'a'])
{
int poz=new_node();
t[nod].fiu[sir[i]-'a']=poz;
}
nod=t[nod].fiu[sir[i]-'a'];
t[nod].s++;
}
t[nod].nr++;
}
void trie_erase(string sir)
{
int nod=0;
for(int i=0;i<sir.size();i++)
{
int nod1=t[nod].fiu[sir[i]-'a'];
if(--t[nod1].s==0)
{
t[nod].fiu[sir[i]-'a']=0;
liber.push_back(nod1);
}
nod=nod1;
}
t[nod].nr--;
}
int trie_count(string sir)
{
int nod=0;
for(int i=0;i<sir.size();i++)
if(!t[nod].fiu[sir[i]-'a']) return 0;
else nod=t[nod].fiu[sir[i]-'a'];
return t[nod].nr;
}
int trie_prefix(string sir)
{
int nod=0;
for(int i=0;i<sir.size();i++)
if(!t[nod].fiu[sir[i]-'a']) return i;
else nod=t[nod].fiu[sir[i]-'a'];
return sir.size();
}
int main()
{
ifstream cin("trie.in");
ofstream cout("trie.out");
int tip;
string sir;
t.push_back(trie());
while(cin>>tip>>sir)
{
if(tip==0) trie_insert(sir);
else if(tip==1) trie_erase(sir);
else if(tip==2) cout<<trie_count(sir)<<"\n";
else cout<<trie_prefix(sir)<<"\n";
}
return 0;
}