Pagini recente » Cod sursa (job #2779067) | Cod sursa (job #2967624) | Cod sursa (job #2276189) | Cod sursa (job #3129433) | Cod sursa (job #1741328)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define CH *s-97
struct Trie
{
int words;
int prefixies;
Trie* edges[26];
Trie()
{
words = prefixies = 0;
for(int i = 0 ; i <26 ; i++)
edges[i] = nullptr;
}
~Trie()
{
clear(this);
}
void clear(Trie* node)
{
if(node->prefixies>0)
{
for(int i = 0 ; i < 26 ; i++)
clear(node->edges[i]);
delete []edges;
}
}
} *T = new Trie();
void insertWord(Trie* node,char *s)
{
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
insertWord(node->edges[CH],s+1);
}
void eraseWord(Trie* node,char *s)
{
if(*s == '\0')
node->words--;
else
{
node->prefixies--;
eraseWord(node->edges[CH],s+1);
}
/*
if(goToBottom->words == 0 && goToBottom->prefixies == 0 && T != goToBottom)
{
Trie* eraseBottom = node;
s = word;
while(*(s+1)!='\0' && eraseBottom->prefixies>0)
{
eraseBottom = eraseBottom->edges[CH];
s++;
}
delete eraseBottom->edges[CH];
}*/
}
int aparitii(Trie*node,char *s)
{
while(*s!='\0')
{
node = node->edges[CH];
s++;
}
return node->words;
}
int lungimeCeluiMaiLungPrefix(Trie* node, char *s)
{
int lungime = 0;
while(*s!='\0' && node->edges[CH]!=NULL && (node->edges[CH]->prefixies>0 || node->edges[CH]->words>0))
{
lungime++;
node = node->edges[CH];
s++;
}
return lungime;
}
int main()
{
int x;
string cuv;
char *s;
while( in >> x >> cuv)
{
s = new char[cuv.size()+1];
for(int i = 0 ; i < cuv.size() ; i++)
s[i] = cuv[i];
s[cuv.size()] = '\0';
switch(x)
{
case 0:
insertWord(T,s);
break;
case 1:
eraseWord(T,s);
break;
case 2:
out << aparitii(T,s) << '\n';
break;
case 3:
out << lungimeCeluiMaiLungPrefix(T,s)<<'\n';
break;
}
delete []s;
}/*
insertWord(T,"lat");
eraseWord(T,"lat");
insertWord(T,"latitudine");
insertWord(T,"lat");
cout<<lungimeCeluiMaiLungPrefix(T,"latime");*/
return 0;
}