Pagini recente » Cod sursa (job #2618064) | Cod sursa (job #853113) | Cod sursa (job #2532770) | Cod sursa (job #722498) | Cod sursa (job #1881593)
#include <cstdio>
#include <cstring>
#define MAXLIT 26
#define MAXLUN 25
using namespace std;
struct trie{
int cate, nfii;
trie *fii[MAXLIT];
trie(){
cate=nfii=0;
memset(fii, 0, sizeof(fii));
}
};
trie *t=new trie;
void add(trie *nod, char *s){
if(*s=='\n'){
nod->cate++;
return;
}
if(nod->fii[*s-'a']==0){
nod->nfii++;
nod->fii[*s-'a']=new trie;
}
add(nod->fii[*s-'a'], s+1);
}
int del(trie *nod, char *s){
if(*s=='\n')
nod->cate--;
else if(del(nod->fii[*s-'a'], s+1)){
nod->fii[*s-'a']=0;
nod->nfii--;
}
if(nod->nfii==0 && nod->cate==0 && nod!=t){
delete nod;
return 1;
}
return 0;
}
int nrap(trie *nod, char *s){
if(*s=='\n')
return nod->cate;
if(nod->fii[*s-'a'])
return nrap(nod->fii[*s-'a'], s+1);
return 0;
}
int pref(trie *nod, char *s, int l){
if(*s=='\n')
return l;
if(nod->fii[*s-'a'])
return pref(nod->fii[*s-'a'], s+1, l+1);
return l;
}
int main()
{
FILE *fin, *fout;
char q[MAXLUN];
fin=fopen("trie.in", "r");
fgets(q, MAXLUN, fin);
fout=fopen("trie.out", "w");
while(feof(fin)==0){
switch(q[0]){
case '0': add(t, q+2); break;
case '1': del(t, q+2); break;
case '2': fprintf(fout, "%d\n", nrap(t, q+2)); break;
case '3': fprintf(fout, "%d\n", pref(t, q+2, 0)); break;
}
fgets(q, MAXLUN, fin);
}
fclose(fin);
fclose(fout);
return 0;
}