Pagini recente » Cod sursa (job #2858336) | Cod sursa (job #1708781) | Cod sursa (job #196395) | Cod sursa (job #1178956) | Cod sursa (job #956305)
Cod sursa(job #956305)
#include<fstream>
#include<iostream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int i, opt;
char text[21];
struct Trie {
int prefix, word;
Trie *succ[26];
Trie()
{
prefix = 0;
word = 0;
for(i = 0; i < 26; i++)
succ[i] = 0;
}
};
void addWord(Trie *nod, char *sir)
{
if(sir[0] == '\0')
{
nod->word++;
nod->prefix++;
}
else
{
nod->prefix += 1;
if(nod->succ[sir[0] - 'a'] == 0) // daca nu exista un succesor cu litera curenta
{
nod->succ[sir[0] - 'a'] = new Trie;
}
addWord(nod->succ[sir[0] - 'a'], sir + 1);
}
}
int longestPrefix(Trie *nod, char *sir, int k)
{
if(nod == 0 || sir[0] == '\0' || !nod->succ[sir[0] - 'a'])
return k;
else
return longestPrefix(nod->succ[sir[0] - 'a'], sir + 1, k + 1);
}
int wordCount(Trie *nod, char *sir)
{
if(nod == 0) // daca nu exista cuvantul in arbore returnam 0
return 0;
else
{
if(sir[0] == '\0') // inseamna ca suntem pe nodul caracterului din finalul cuvantului
return nod->word;
else // mergem pe fiul corespunzator caracterului urmator, micsorand sirul
{
return wordCount(nod->succ[sir[0] - 'a'], sir + 1);
}
}
}
void remove(Trie *nod, char *sir)
{
if(sir[0] != '\0')
{
remove(nod->succ[sir[0] - 'a'], sir + 1);
if(nod->succ[sir[0] - 'a']->prefix == 0 && nod->succ[sir[0] - 'a']->word == 0)
{
delete nod->succ[sir[0] - 'a'];
nod->succ[sir[0] - 'a'] = 0;
}
nod->prefix--;
}
else
{
nod->word--;
nod->prefix--;
}
}
int main()
{
Trie *rad = new Trie;
while(fin >> opt >> text)
{
switch(opt)
{
case 0:
addWord(rad, text);
break;
case 1:
remove(rad, text);
break;
case 2:
fout << wordCount(rad, text) << endl;
break;
case 3:
fout << longestPrefix(rad, text, 0) << endl;
}
}
return 0;
}