Pagini recente » Cod sursa (job #2323744) | Cod sursa (job #1897956) | Cod sursa (job #1680232) | Cod sursa (job #2934740) | Cod sursa (job #1728147)
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;
class Nod{
public:
Nod* v[26];
int freq;
char litera;
Nod(char c){
freq=0;
litera=c;
for(int i=0;i<26;i++)
v[i]=NULL;
}
Nod(){
freq=0;
litera=' ';
for(int i=0;i<26;i++)
v[i]=NULL;
}
};
void add(Nod* head,char *cuvant){
for(int i=0;i<(int)strlen(cuvant);i++){
if(head->v[cuvant[i]-'a'] == NULL)
head->v[cuvant[i]-'a'] = new Nod(cuvant[i]);
(head->v[cuvant[i]-'a']->freq)++;
head = head->v[cuvant[i]-'a'];
}
}
void sterge(Nod *head,char *cuvant){
if((int)strlen(cuvant) > 0){
(head->v[cuvant[0]-'a']->freq)--;
sterge(head->v[cuvant[0]-'a'],cuvant+1);
if(head->v[cuvant[0]-'a'] != NULL && head->v[cuvant[0]-'a']->freq == 0){
delete head->v[cuvant[0]-'a'];
head->v[cuvant[0]-'a']=NULL;
}
}
}
int count_cuv(Nod*head,char *cuvant){
int c;
for(int i=0;i<(int)strlen(cuvant) && head!=NULL;i++)
head = head->v[cuvant[i]-'a'];
if(head == NULL) return 0;
c=head->freq;
for(int i=0;i<26;i++)
if(head->v[i]!=NULL)
c-=head->v[i]->freq;
return c;
}
int longest_prefix(Nod *head,char *cuvant){
if(head->v[cuvant[0]-'a'] == NULL)
return 0;
int c =0;
for(int i=0;i<strlen(cuvant);i++){
if(head->v[cuvant[i]-'a']!=NULL ){
c++;
head = head->v[cuvant[i]-'a'];
}
else break;
}
return c;
}
int main()
{
Nod* head = new Nod;
ifstream f("trie.in");
ofstream g("trie.out");
int nr;
char cuvant[22];
while(f >> nr){
f >> cuvant;
if(nr == 0)
add(head,cuvant);
else if(nr == 1)
sterge(head,cuvant);
else if(nr == 2)
g << count_cuv(head,cuvant) << endl;
else
g << longest_prefix(head,cuvant) << endl;
}
return 0;
}