Pagini recente » Cod sursa (job #2781131) | Cod sursa (job #1687085) | Cod sursa (job #2867557) | Cod sursa (job #1337285) | Cod sursa (job #715864)
Cod sursa(job #715864)
#include <cstdio>
#include <cstring>
#include <vector>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
#define file_in "trie.in"
#define file_out "trie.out"
#define sigma 26
class trie{
public:
int nrc;
int nrf;
trie * f[sigma];
trie();
};
trie::trie(){
nrc=nrf=0;
memset(f,0,sizeof(f));
}
void inserare_cuvant(char * cuvant, trie * T){
int n=strlen(cuvant);
for (int i=0;i<n;++i){
int c=cuvant[i]-'a';
if (T->f[c]!=NULL){
T=T->f[c];
}
else{
T->f[c]=new trie();
T=T->f[c];
}
T->nrf++;
}
T->nrc++;
}
void stergere_cuvant(char * cuvant, trie * T){
int n=strlen(cuvant);
for (int i=0;i<n;++i){
int c=cuvant[i]-'a';
if (T->f[c]!=NULL){
T=T->f[c];
}
T->nrf--;
}
T->nrc--;
}
int numara_cuvant(char * cuvant, trie * T){
int n=strlen(cuvant);
for (int i=0;i<n;++i){
int c=cuvant[i]-'a';
if (T->f[c]!=NULL){
T=T->f[c];
}
else
return 0;
}
return T->nrc;
}
int prefix_cuvant(char * cuvant, trie * T){
int n=strlen(cuvant);
int i=0;
int c=cuvant[0]-'a';
while(i<n && T->f[c]!=NULL && T->f[c]->nrf!=0){
if (T->f[c]!=NULL)
T=T->f[c];
i++;
c=cuvant[i]-'a';
}
return i;
}
int main(){
trie T;
//freopen(file_in,"r",stdin);
//freopen(file_out,"w",stdout);
ifstream f(file_in);
ofstream g(file_out);
while(!f.eof()){
int Tip;
char Cuvant[sigma];
f>>Tip>>Cuvant;
if (Tip==0){
inserare_cuvant(Cuvant, &T);
continue;
}
if (Tip==1){
stergere_cuvant(Cuvant, &T);
continue;
}
if (Tip==2){
g<<numara_cuvant(Cuvant, &T)<<"\n";
continue;
}
if (Tip==3){
g<<prefix_cuvant(Cuvant, &T)<<"\n";
continue;
}
Tip=4;
}
return 0;
}