Pagini recente » Cod sursa (job #1434989) | Cod sursa (job #2545332) | Cod sursa (job #1467127) | Cod sursa (job #1479682) | Cod sursa (job #2753011)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct trie{
int cuv, prefix;
trie *copii[26];
trie(){
cuv=0; prefix=0;
for(int i=0; i<26; i++) copii[i]=0;
}
};
void adaugare (trie *rad, char *c, int poz)
{
rad->prefix++;
if(poz==strlen(c)){
rad->cuv++;
return;
}
int lit=c[poz]-'a';
if(rad->copii[lit]==0)
rad->copii[lit]=new trie;
adaugare(rad->copii[lit], c, poz+1);
}
void stergere (trie *rad, char *c, int poz)
{
rad->prefix--;
if(poz==strlen(c)){
rad->cuv--;
return;
}
int lit=c[poz]-'a';
stergere(rad->copii[lit], c, poz+1);
}
int nr_aparitii (trie *rad, char *c, int poz)
{
if(poz==strlen(c))
return rad->cuv;
int lit=c[poz]-'a';
if(rad->copii[lit]==0 || rad->copii[lit]->prefix==0)
return 0;
return nr_aparitii(rad->copii[lit], c, poz+1);
}
int lung_prefix_comun (trie *rad, char *c, int poz)
{
if(poz==strlen(c))
return strlen(c);
int lit=c[poz]-'a';
if(rad->copii[lit]==0 || rad->copii[lit]->prefix==0)
return poz;
return lung_prefix_comun(rad->copii[lit], c, poz+1);
}
int main()
{
trie *rad=new trie;
int op; char ch[21];
while(fin>>op>>ch)
{
switch(op){
case 0: adaugare(rad, ch, 0); break;
case 1: stergere(rad, ch, 0); break;
case 2: fout<<nr_aparitii(rad, ch, 0)<<"\n"; break;
case 3: fout<<lung_prefix_comun(rad, ch, 0)<<"\n"; break;
}
}
return 0;
}