Pagini recente » Cod sursa (job #613732) | Cod sursa (job #1188962) | Cod sursa (job #344636) | Cod sursa (job #1274179) | Cod sursa (job #2298662)
#include<iostream>
#include<cstdio>
#include<cstring>
#define ch (*s-'a')
using namespace std;
FILE*si=fopen("trie.in","r");
FILE*so=fopen("trie.out","w");
struct trie
{
int cont,nf;
trie* v[26];
trie()
{
cont=nf=0;
memset(v,0,sizeof(v));
}
};
trie* t=new trie;
void add(trie* nod,char* s)
{
if(*s=='\n')
{
nod->cont++;
return;
}
if(nod->v[ch]==0)
{
nod->v[ch]=new trie;
nod->nf++;
}
add(nod->v[ch],s+1);
}
int del(trie* nod,char* s)
{
if(*s=='\n')
nod->cont--;
else
if(del(nod->v[ch],s+1))
{
nod->v[ch]=0;
nod->nf--;
}
if(nod->cont==0&&nod->nf==0&&nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int nap(trie*nod,char*s)
{
if(*s=='\n')
return nod->cont;
if(nod->v[ch])
return nap(nod->v[ch],s+1);
return 0;
}
int lcp(trie* nod,char* s,int cont)
{
if(*s=='\n'||nod->v[ch]==0)
return cont;
return lcp(nod->v[ch],s+1,cont+1);
}
int main()
{
char v[32];
fgets(v,32,si);
while(!feof(si))
{
switch(v[0])
{
case '0':add(t,v+2); break;
case '1':del(t,v+2); break;
case '2':fprintf(so,"%i\n",nap(t,v+2)); break;
case '3':fprintf(so,"%i\n",lcp(t,v+2,0)); break;
}
fgets(v,32,si);
}
return 0;
}