Pagini recente » Cod sursa (job #2216421) | Cod sursa (job #1140198) | Cod sursa (job #40210) | Cod sursa (job #2256692) | Cod sursa (job #834202)
Cod sursa(job #834202)
#include<fstream>
#include<string.h>
#define set0 for(int i=0;i<26;i++) fii[i]=0;
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct TRIE
{
int nr_apar,nr_fii;
TRIE *fii[26];
TRIE()
{
nr_apar=nr_fii=0;
set0;
}
}*G;
char cuv[30];
int sw;
void add()
{
int i=0;
TRIE *p=G;
while(cuv[i] && p->fii[(int)cuv[i]-'a'])
p=p->fii[(int)cuv[i++]-'a'];
if(!cuv[i])
{
p->nr_apar++;
return;
}
while(cuv[i])
{
p->nr_fii++;
p->fii[(int)cuv[i]-'a']=new TRIE;
p=p->fii[(int)cuv[i]-'a'];
i++;
}
p->nr_apar++;
}
void print_cuv()
{
int i=0;
TRIE *p=G;
while(cuv[i] && p->fii[(int)cuv[i]-'a'])
p=p->fii[(int)cuv[i++]-'a'];
if(!cuv[i])
g<<p->nr_apar<<'\n';
else
g<<0<<'\n';
}
void printf_pref()
{
int i=0;
TRIE *p=G;
while(cuv[i] && p->fii[(int)cuv[i]-'a'])
p=p->fii[(int)cuv[i++]-'a'];
g<<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==1)
{
p->nr_fii--;
p->fii[(int)cuv[i]-'a']=0;
sw=0;
}
if(!p->nr_apar && !p->nr_fii && p!=G)
{
delete p;
sw=1;
}
}
int main()
{
int choice;
G=new TRIE;
while(f>>choice>>cuv)
{
switch(choice)
{
case 0:
{
add();
break;
}
case 1:
{
del(0,G);
break;
}
case 2:
{
print_cuv();
break;
}
case 3:
{
printf_pref();
break;
}
}
}
f.close();
g.close();
return 0;
}