Pagini recente » Cod sursa (job #177979) | Cod sursa (job #1837442) | Cod sursa (job #1617206) | Cod sursa (job #152544) | Cod sursa (job #2019483)
#include <fstream>
#include <cstring>
using namespace std;
struct Trie{
int NumberOfAppeareances;
int NumberOfSons;
Trie *Nodes[26];
Trie(){
NumberOfAppeareances=0;
NumberOfSons=0;
memset(Nodes,NULL,sizeof(Nodes));
}
};
Trie *T=new Trie;
int op;
void add(Trie *,char []);
int remove(Trie *,Trie *,char[]);
int NumberOfWords(Trie *,char []);
int LongestPrefix(Trie *,char [],int);
char cuv[25];
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
scanf("%d %s",&op,cuv);
while (!feof(stdin)){
if (op==0){
add(T,cuv);
}
if (op==1){
remove(T,T,cuv);
}
if (op==2){
printf("%d\n",NumberOfWords(T,cuv));
}
if (op==3){
printf("%d\n",LongestPrefix(T,cuv,0));
}
scanf("%d %s",&op,cuv);
}
}
void add(Trie *T,char s[]){
if (strlen(s)==0){
T->NumberOfAppeareances++;
}
else {
int pos=s[0]-'a';
if (!T->Nodes[pos]){
T->Nodes[pos]=new Trie;
T->NumberOfSons++;
}
add(T->Nodes[pos],s+1);
}
}
int remove(Trie *T,Trie *rad,char s[]){
if (strlen(s)==0){
T->NumberOfAppeareances--;
}
else {
int pos=s[0]-'a';
if (remove(T->Nodes[pos],rad,s+1)){
T->NumberOfSons--;
delete T->Nodes[pos];
}
}
if (T->NumberOfAppeareances==0&&T->NumberOfSons==0&&T!=rad){
delete T;
return 1;
}
return 0;
}
int NumberOfWords(Trie *T,char s[]){
if (strlen(s)==0){
return T->NumberOfAppeareances;
}
int pos=s[0]-'a';
if (T->Nodes[pos]){
return NumberOfWords(T->Nodes[pos],s+1);
}
return 0;
}
int LongestPrefix(Trie *T,char s[],int level){
if (strlen(s)==0){
return level;
}
int pos=s[0]-'a';
if (T->Nodes[pos]){
return LongestPrefix(T->Nodes[pos],s+1,level+1);
}
return level;
}