Pagini recente » Cod sursa (job #2172241) | Cod sursa (job #80208) | Cod sursa (job #1806651) | Cod sursa (job #1423109) | Cod sursa (job #781064)
Cod sursa(job #781064)
#include<fstream>
#include<cstring>
using namespace std;
char buff[30];
int intc;
struct trie
{int nr,nrfii;
trie* son[26];
trie()
{nr=0; nrfii=0;
for(int psi=0; psi<26; psi++)
son[psi]=0;}
};
trie *T=new trie;
void add(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
{nod->nr++;
return;}
intc=*buff-'a';
if(nod->son[intc]==0)
{nod->son[intc]=new trie;
nod->nrfii++;}
add(nod->son[intc],buff+1);
}
int erase(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
{nod->nr--;}
else
{intc=*buff-'a';
if(nod->son[intc])
if(erase(nod->son[intc],buff+1)==1)
{nod->son[intc]=0;
nod->nrfii--;}
}
if(nod->nr==0 && nod->nrfii==0 && nod!=T)
{delete nod;
return 1;}
return 0;
}
int count(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
return nod->nr;
intc=*buff-'a';
if(nod->son[intc]!=0)
return count(nod->son[intc],buff+1);
return 0;
}
int prefix(trie *nod, char *buff,int grad)
{intc=*buff-'a';
if(*buff<'a' || *buff>'z' || nod->son[intc]==0)
return grad;
return prefix(nod->son[intc],buff+1,grad+1);
}
int main()
{ifstream f("trie.in");
ofstream g("trie.out");
int caz;
while(f.getline(buff,30))
{
if(buff[0]=='0') add(T,buff+2); else
if(buff[1]=='1') erase(T,buff+2); else
if(buff[0]=='2') g<<count(T,buff+2)<<endl; else
if(buff[0]=='3') g<<prefix(T,buff+2,0)<<endl;}
f.close();
g.close();
return 0;}