Pagini recente » Cod sursa (job #2203507) | Cod sursa (job #3133860) | Cod sursa (job #2368524) | Cod sursa (job #252802) | Cod sursa (job #2883489)
#include <iostream>
#include <fstream>
using namespace std;
const string filename = "trie";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
const int sigma = 26;
char s[25];
struct trie {
int cnt, nr;
trie* nxt[sigma];
trie()
{
cnt = 0;
nr = 0;
for(int i = 0; i < sigma; i++)
nxt[i] = 0;
}
};
trie *root = new trie;
void insert_trie(trie *nod, char *s)
{
if(*s == NULL)
{
nod->cnt++;
return;
}
int ind = *s - 'a';
if(nod->nxt[ind] == 0)
{
nod->nxt[ind] = new trie;
nod->nr++;
}
insert_trie(nod->nxt[ind], s + 1);
}
bool delete_trie(trie *nod, char *s)
{
if(*s == NULL)
nod->cnt--;
else
{
int ind = *s - 'a';
if(delete_trie(nod->nxt[ind], s + 1))
{
nod->nxt[ind] = 0;
nod->nr--;
}
}
if(nod->cnt == 0 && nod->nr == 0 && nod != root)
return 1;
return 0;
}
int query_trie(trie *nod, char *s)
{
if(*s == NULL)
return nod->cnt;
int ind = *s - 'a';
if(nod->nxt[ind])
return query_trie(nod->nxt[ind], s + 1);
return 0;
}
int prefix_trie(trie *nod, char *s, int len)
{
if(*s == NULL)
return len;
int ind = *s - 'a';
if(nod->nxt[ind] == 0)
return len;
return prefix_trie(nod->nxt[ind], s + 1, len + 1);
}
int main()
{
int cer;
while(fin >> cer >> (s + 1))
{
if(cer == 0)
insert_trie(root, (s + 1));
if(cer == 1)
delete_trie(root, (s + 1));
if(cer == 2)
fout << query_trie(root, (s + 1)) << '\n';
if(cer == 3)
fout << prefix_trie(root, (s + 1), 0) << '\n';
}
return 0;
}