Pagini recente » Cod sursa (job #1395) | Cod sursa (job #3192832) | Cod sursa (job #2521984) | Cod sursa (job #1987875) | Cod sursa (job #1741418)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define CH *s-97
struct Trie
{
int words;
int prefixies;
Trie** edges;
Trie()
{
edges = new Trie*[26];
words = prefixies = 0;
for(int i = 0 ; i <26 ; i++)
edges[i] = nullptr;
}
~Trie()
{
delete []edges;
}
} *T = new Trie();
void insertWordn(Trie* node,char *s)
{
do
{
if(node->edges[CH]== NULL)//daca nu exista muchii
node->edges[CH] = new Trie;//adaugam vertexu ca si copil
node->prefixies++;
if(*(s+1)=='\0')
node->edges[CH]->words++;
else
node = node->edges[CH];
s++;
}while(*s!='\0');
}
bool eraseWordn(Trie* node,char *s)
{
Trie *cnode = node;
stack< pair<Trie*,int> > toErase;
pair<Trie*,int> nodepair;
while(*(s+1) != '\0')
{
cnode->prefixies--;
toErase.push(make_pair(cnode->edges[CH],CH));
cnode = cnode->edges[CH];
s++;
}
cnode->words--;
do
{
nodepair = toErase.top();
if(cnode->prefixies == 0 && cnode->words == 0)
{
delete nodepair.first->edges[nodepair.second];
nodepair.first->edges[nodepair.second] = nullptr;
}
cnode = nodepair.first;
toErase.pop();
}while(!toErase.empty());
}
int aparitii(Trie*node,char *s)
{
while(node != NULL && *s!='\0')
{
node = node->edges[CH];
s++;
}
if(*s == '\0' && node != NULL)
return node->words;
return 0;
}
int lungimeCeluiMaiLungPrefix(Trie* node, char *s)
{
int nr = 0;
while(node->edges[CH]!= NULL && *s !='\0')
{
nr++;
node = node->edges[CH];
s++;
}
return nr;
}
int main()
{
char *s = new char[40];
while(in.getline(s,30))
{
switch(s[0])
{
case '0':
insertWordn(T,s+2);
break;
case '1':
eraseWordn(T,s+2);
break;
case '2':
out << aparitii(T,s+2)<<'\n';
break;
case '3':
out << lungimeCeluiMaiLungPrefix(T,s+2)<<'\n';
break;
}
}
return 0;
}