Pagini recente » Cod sursa (job #2795538) | Cod sursa (job #1476615) | Cod sursa (job #65026) | Cod sursa (job #1622118) | Cod sursa (job #3203954)
#include <fstream>
const int NMAX=1005;
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
int cnt, sz;
char ch;
trie *v[26];
trie()
{
int i;
for(i=0; i<26; i++) v[i]=NULL;
cnt=sz=0;
}
};
void trie_insert(trie*, char*, int);
void trie_erase(trie*, char*, int);
int trie_count(trie*, char*, int);
int trie_lp(trie*, char*, int);
char s[NMAX];
int main()
{
int tip;
trie *root=new trie;
while(fin>>tip)
{
fin>>s;
if(tip==0) trie_insert(root, s, 0);
else if(tip==1) trie_erase(root, s, 0);
else if(tip==2) fout<<trie_count(root, s, 0)<<'\n';
else fout<<trie_lp(root, s, 0)<<'\n';
}
return 0;
}
void trie_insert(trie* node, char *s, int lg)
{
if(!s[lg])
{
node->cnt++;
return;
}
if(!node->v[s[lg]-'a'])
{
node->v[s[lg]-'a']=new trie;
node->sz++;
}
trie_insert(node->v[s[lg]-'a'], s, lg+1);
}
void trie_erase(trie* node, char *s, int lg)
{
if(!s[lg]) node->cnt--;
else
{
if(node->v[s[lg]-'a'])
{
trie_erase(node->v[s[lg]-'a'], s, lg+1);
if(node->v[s[lg]-'a']->sz==0 && node->v[s[lg]-'a']->cnt==0)
{
delete node->v[s[lg]-'a'];
node->v[s[lg]-'a']=NULL;
node->sz--;
}
}
}
}
int trie_count(trie *node, char *s, int lg)
{
if(!s[lg]) return node->cnt;
if(!node->v[s[lg]-'a']) return 0;
return trie_count(node->v[s[lg]-'a'], s, lg+1);
}
int trie_lp(trie *node, char *s, int lg)
{
if(!s[lg]) return lg;
if(!node->v[s[lg]-'a']) return lg;
return trie_lp(node->v[s[lg]-'a'], s, lg+1);
}