Pagini recente » Cod sursa (job #2293390) | Cod sursa (job #2803405) | Cod sursa (job #2593953) | Cod sursa (job #2208580) | Cod sursa (job #3337807)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int tip;string s;
struct trie
{
int child,cnt;
trie* v[30];
trie() {
child=cnt=0;
for(int i=0; i<30; i++) v[i]=nullptr;
}
};
trie* root = new trie();
void add(int i,string& s,trie* node)
{
if(i==s.size())
{
node->cnt++;
return;
}
int ind=s[i]-'a'+1;
if(!node->v[ind])
{
node->child++;
node->v[ind]=new trie;
}
add(i+1,s,node->v[ind]);
}
bool check(trie* node)
{
return (!node->cnt && !node->child && node!=root);
}
bool del(int i,string& s,trie* node)
{
if(i==s.size())
{
if(node->cnt) node->cnt--;
if(check(node))
{
delete node;
return true;
}
return false;
}
int ind=s[i]-'a'+1;
if(del(i+1,s,node->v[ind]))
{
node->child--;
node->v[ind]=nullptr;
}
if(check(node))
{
delete node;
return true;
}
return false;
}
int num(int i,string& s,trie* node)
{
if(i==s.size()) return node->cnt;
int ind=s[i]-'a'+1;
if(!node->v[ind]) return 0;
return num(i+1,s,node->v[ind]);
}
int pref(int i,string& s,trie* node)
{
if(i==s.size()) return i;
int ind=s[i]-'a'+1;
if(!node->v[ind]) return i;
return pref(i+1,s,node->v[ind]);
}
int main()
{
while(fin>>tip>>s)
{
//fout<<tip<<" "<<s<<endl;
if(tip==0) add(0,s,root);
else if(tip==1) del(0,s,root);
else if(tip==2) fout<<num(0,s,root)<<'\n';
else fout<<pref(0,s,root)<<'\n';
}
return 0;
}