Pagini recente » Cod sursa (job #1819506) | Cod sursa (job #2723499) | Borderou de evaluare (job #1015280) | Cod sursa (job #73007) | Cod sursa (job #1741357)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
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 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;
char *s = new char[40];
while(in.getline(s,30))
{
switch(s[0])
{
case '0':
insertWord(T,s+2);
break;
case '1':
eraseWord(T,s+2);
break;
case '2':
out << aparitii(T,s+2)<<'\n';
break;
case '3':
out << lungimeCeluiMaiLungPrefix(T,s+2)<<'\n';
break;
}
}
/*
insertWord(T,"lat");
eraseWord(T,"lat");
insertWord(T,"latitudine");
insertWord(T,"lat");
cout<<lungimeCeluiMaiLungPrefix(T,"latime");*/
return 0;
}