Pagini recente » Cod sursa (job #25618) | Cod sursa (job #51037) | Cod sursa (job #929469) | Cod sursa (job #355391) | Cod sursa (job #1741348)
#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;
}
} *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);
}
bool eraseWord(Trie* node,char *s)
{
if(*s == '\0')
node->words--;
else
{
node->prefixies--;
if(eraseWord(node->edges[CH],s+1))
{
delete node->edges[CH];
node->edges[CH] = nullptr;
}
}
if(node->words == 0 && node->prefixies == 0)
return true;
return false;
}
int aparitii(Trie*node,char *s)
{
if(node != NULL && *s!='\0')
return aparitii(node->edges[CH],s+1);
if(*s == '\0')
return node->words;
return 0;
}
int lungimeCeluiMaiLungPrefix(Trie* node, char *s)
{
if(node->edges[CH]!= NULL && *s !='\0')
return 1 + lungimeCeluiMaiLungPrefix(node->edges[CH],s+1);
return 0;
}
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;
}