Pagini recente » Cod sursa (job #2537869) | Cod sursa (job #1517132) | Cod sursa (job #2845869) | Cod sursa (job #2919625) | Cod sursa (job #1211880)
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
int fii,nr;
trie *f[26];
trie()
{
fii=nr=0;
for (int i=0;i<26;++i)
f[i]=0;
}
} *root;
int t;
char s[26];
void insertTrie(trie *r, char *s)
{
if (*s!=0)
{
if (r->f[*s-'a']==0)
r->f[*s-'a'] = new trie, r->fii++;
insertTrie(r->f[*s-'a'],s+1);
}
else
r->nr++;
}
int deleteTrie(trie *&r, char *s)
{
if (*s==0)
{
r->nr--;
if (r->fii==0 && r->nr==0 && r!=root)
{
delete r;
r = NULL;
return 1;
}
}
else
{
if (deleteTrie(r->f[*s-'a'],s+1)!=0)
{
r->fii--;
if (r->fii==0 && r->nr==0 && r!=root)
{
delete r;
r = NULL;
return 1;
}
}
}
return 0;
}
int queryTrie(trie *&r, char *s)
{
if (*s==0)
return r->nr;
if (r->f[*s-'a']==0)
return 0;
return queryTrie(r->f[*s-'a'],s+1);
}
int prefixTrie(trie *&r, char *s)
{
if (*s==0 || r->f[*s-'a']==0)
return 0;
return 1+prefixTrie(r->f[*s-'a'],s+1);
}
int main()
{
root = new trie;
while (fin>>t>>s)
{
switch (t)
{
case 0:
insertTrie(root,s);
break;
case 1:
deleteTrie(root,s);
break;
case 2:
fout<<queryTrie(root,s)<<"\n";
break;
case 3:
fout<<prefixTrie(root,s)<<"\n";
break;
}
}
return 0;
}