Pagini recente » Cod sursa (job #2193951) | Cod sursa (job #2526921) | Cod sursa (job #2313072) | Cod sursa (job #1174352) | Cod sursa (job #933096)
Cod sursa(job #933096)
#include<fstream>
#include<cstring>
#define Z cuv[i]-'a'
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TRIE
{
int nr_apar,nr_fii;
TRIE *fii[26];
TRIE()
{
nr_apar=nr_fii=0;
for(short i=0;i<26;i++) fii[i]=0;
}
}*G;
char cuv[25];
bool sw;
inline void add()
{
short i=0;
TRIE *p=G;
for(;cuv[i] && p->fii[Z];p=p->fii[Z],i++);
if(!cuv[i])
{
p->nr_apar++;
return;
}
while(cuv[i])
{
p->nr_fii++;
p=p->fii[Z]=new TRIE;
i++;
}
p->nr_apar++;
}
inline void print_cuv()
{
short i=0;
TRIE *p=G;
for(;cuv[i] && p->fii[Z];p=p->fii[Z],i++);
if(!cuv[i])
fout<<p->nr_apar<<'\n';
else
fout<<0<<'\n';
}
inline void print_pref()
{
short i=0;
TRIE *p=G;
for(;cuv[i] && p->fii[Z];p=p->fii[Z],i++);
fout<<i<<'\n';
}
inline void del(int i,TRIE *p)
{
if(cuv[i])
del(i+1,p->fii[(int)cuv[i]-'a']);
else
p->nr_apar--;
if(sw)
{
p->nr_fii--;
p->fii[Z]=0;
sw=0;
}
if(!p->nr_apar && !p->nr_fii)
{
delete p;
sw=1;
}
}
int main()
{
int choice;
G=new TRIE;
G->nr_apar=1;
while(fin>>choice>>cuv)
{
if(choice==0)
add();
if(choice==1)
del(0,G);
if(choice==2)
print_cuv();
if(choice==3)
print_pref();
}
fin.close();
fout.close();
return 0;
}