Pagini recente » Cod sursa (job #116481) | Cod sursa (job #1344388) | Cod sursa (job #1009392) | Cod sursa (job #1229093) | Cod sursa (job #2281164)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
struct trie
{
int number, children;
vector < pair < char, trie* > > next;
trie()
{
number = children = 0;
}
} *start;
char str[24];
void trie_insert(trie*, char*);
bool trie_delete(trie*, char*);
int trie_count(trie*, char*);
int trie_prefix(trie*, char*);
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
start = new trie;
while(fgets(str, 24, stdin))
{
switch(str[0])
{
case '0': trie_insert(start, str+2); break;
case '1': trie_delete(start, str+2); break;
case '2': printf("%i\n", trie_count(start, str+2)); break;
case '3': printf("%i\n", trie_prefix(start, str+2)); break;
default: return 0;
}
}
return 0;
}
int trie_prefix(trie *nod, char *str)
{
int pos = 0;
while(*str != '\n')
{
vector < pair < char, trie* > > :: iterator it;
for(it = nod->next.begin(); it != nod->next.end(); ++it)
if(it->first == *str)
break;
if(it == nod->next.end())
break;
nod = it->second;
str++;
pos++;
}
return pos;
}
int trie_count(trie *nod, char *str)
{
while(*str != '\n')
{
vector < pair < char, trie* > > :: iterator it;
for(it = nod->next.begin(); it != nod->next.end(); ++it)
if(it->first == *str)
break;
if(it == nod->next.end())
return 0;
nod = it->second;
str++;
}
return nod->number;
}
bool trie_delete(trie *nod, char *str)
{
if(*str == '\n')
nod->number--;
else
{
vector < pair < char, trie* > > :: iterator it;
for(it = nod->next.begin(); it != nod->next.end(); ++it)
if(it->first == *str)
break;
if(trie_delete(it->second, str+1))
{
nod->children--;
nod->next.erase(it);
}
}
if(nod->children == 0 && nod->number == 0 && nod != start)
{
delete nod;
return true;
}
return false;
}
void trie_insert(trie *nod, char *str)
{
while(*str != '\n')
{
vector < pair < char, trie* > > :: iterator it;
for(it = nod->next.begin(); it != nod->next.end(); ++it)
if(it->first == *str)
break;
if(it == nod->next.end())
{
nod->next.push_back(make_pair(*str, new trie));
nod->children++;
nod = nod->next.back().second;
}
else
nod = it->second;
str++;
}
nod->number++;
}