Pagini recente » Cod sursa (job #3184160) | Cod sursa (job #1198286) | Cod sursa (job #2766194) | Cod sursa (job #1063972) | Cod sursa (job #2871582)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TrieNode{
TrieNode *fii[26];
int nrfii,nrcuv;
TrieNode(){
for(int i=0;i<26;i++) fii[i]=0;
nrfii=nrcuv=0;
}
};
TrieNode *root = new TrieNode;
void adauga(TrieNode *crawl,char *s){
if(*s=='\0'){
crawl->nrcuv++;
return;
}
if(crawl->fii[*s-'a']==0){
crawl->fii[*s-'a'] = new TrieNode;
crawl->nrfii++;
}
adauga(crawl->fii[*s-'a'],s+1);
}
int sterge(TrieNode *crawl,char *s){
if(*s=='\0'){
crawl->nrcuv--;
}else if(sterge(crawl->fii[*s-'a'],s+1)){
crawl->nrfii--;
crawl->fii[*s-'a']=0;
}
if(crawl->nrfii==0 && crawl->nrcuv==0 && crawl!=root){
delete crawl;
return 1;
}
return 0;
}
int nraparitii(TrieNode *nod,char *s){
if(*s=='\0')
return nod->nrcuv;
if(nod->fii[*s-'a'])
return nraparitii(nod->fii[*s-'a'],s+1);
return 0;
}
int lungprefix(TrieNode *nod,char *s,int rez){
if(*s=='\0' or nod->fii[*s-'a']==0)
return rez;
return lungprefix(nod->fii[*s-'a'],s+1,rez+1);
}
int main()
{
int o;
char w[21];
while(fin >> o >> w){
if(o==0) adauga(root,w);
else if(o==1) sterge(root,w);
else if(o==2) fout << nraparitii(root,w) << '\n';
else fout << lungprefix(root,w,0) << '\n';
}
return 0;
}