Pagini recente » Cod sursa (job #2744357) | Cod sursa (job #2852371) | Cod sursa (job #62204) | Borderou de evaluare (job #1567991) | Cod sursa (job #2519038)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int nrcuvinte;
int nrfii;
trie *f[26];
trie(){
nrcuvinte=0;
nrfii=0;
for(int i=0; i<26; i++){
f[i]=NULL;
}
}
};
int n, m, t, i, j;
char s[30];
trie *radacina;
void AdaugaCuvant(trie *nod, char *text){
if(*text!=0){
/// verific daca exista deja litera aceea, iar daca nu, o adaug
if(nod->f[*text-'a']==NULL){
nod->nrfii++;
nod->f[*text-'a']=new trie;
}
AdaugaCuvant(nod->f[*text-'a'], text+1);
}else{
nod->nrcuvinte++;
}
}
int StergeCuvant(trie *nod, char *text){
if(*text==0){
nod->nrcuvinte--;
if(nod->nrcuvinte==0 && nod->nrfii==0 && nod!=radacina){
delete nod;
return 1;
}
return 0;
}
if(nod->f[*text-'a']==NULL){
return 0;
}
if(StergeCuvant(nod->f[*text-'a'], text+1)){
nod->nrfii--;
nod->f[*text-'a']=NULL;
if(nod->nrcuvinte==0 && nod->nrfii==0 && nod!=radacina){
delete nod;
return 1;
}
return 0;
}
return 0;
}
int NrAparitii(trie *nod, char *text){
if(*text==0){
return nod->nrcuvinte;
}
if(nod->f[*text-'a']==NULL){
return 0;
}
return NrAparitii(nod->f[*text-'a'], text+1);
}
int LungimePrefix(trie *nod, char *text){
if(*text==0){
return 0;
}
if(nod->f[*text-'a']==NULL){
return 0;
}
return 1+LungimePrefix(nod->f[*text-'a'], text+1);
}
int main(){
radacina=new trie;
while(fin>>t){
fin>>s;
if(t==0){
/// adauga o aparitie a cuvantului s in lista
AdaugaCuvant(radacina, s);
}
if(t==1){
/// sterge o aparitie a cuvantului s din lista
StergeCuvant(radacina, s);
}
if(t==2){
/// tipareste numarul de aparitii ale cuvantului s in lista
fout<<NrAparitii(radacina, s)<<"\n";
}
if(t==3){
/// tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista
fout<<LungimePrefix(radacina, s)<<"\n";
}
}
}