Pagini recente » Cod sursa (job #1344562) | Cod sursa (job #63768) | Cod sursa (job #2290664) | Cod sursa (job #2328366) | Cod sursa (job #2053437)
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout("trie.out");
typedef struct nod
{
nod* C[30];
int nra[30];
nod* par;
} NOD;
int tip;
string x;
NOD *start;
void addN(string x)
{
NOD *p;
p=new NOD;
p=start;
for (unsigned int i=0; i<x.length(); i++)
{
if (p->C[x[i]-'a']==NULL)
{
p->C[x[i]-'a']=new NOD;
p->nra[x[i]-'a']=1;
for (int j=0; j<=29; j++)
{
p->C[x[i]-'a']->C[j]=NULL;
p->C[x[i]-'a']->nra[j]=0;
}
}
else
p->nra[x[i]-'a']++;
p=p->C[x[i]-'a'];
}
}
void remV(string x)
{
NOD *p,*par;
p=new NOD;
p=start;
for (unsigned int i=0; i<x.length(); i++)
{
p->nra[x[i]-'a']--;
if (i>1 && p->nra[x[i]-'a']==0)
par=p;
if (p->C[x[i]-'a']!=NULL)
p=p->C[x[i]-'a'];
if (i>1 && p->nra[x[i]-'a']==0)
delete par;
}
}
void caut(string x)
{
NOD *p;
p=new NOD;
p=start;
unsigned int i;
int nr1,nr2;
for (i=0; i<x.length()-1; i++)
{
if (p->C[x[i]-'a']!=NULL)
p=p->C[x[i]-'a'];
else
{
fout<<"0\n";
return;
}
}
nr1=p->nra[x[i]-'a'];
if (p->C[x[i]-'a']!=NULL)
p=p->C[x[i]-'a'];
else
{
fout<<"0\n";
return;
}
nr2=0;
for (int i=0; i<=29; i++)
nr2+=p->nra[i];
fout<<nr1-nr2<<"\n";;
}
void mi(string x)
{
NOD *p;
p=new NOD;
p=start;
for (unsigned int i=0; i<x.length(); i++)
{
if (p->nra[x[i]-'a']==0)
{
fout<<i<<"\n";
return;
}
if (p->C[x[i]-'a']!=NULL)
p=p->C[x[i]-'a'];
}
fout<<x.length()<<"\n";
}
int main()
{
start= new NOD;
for (int i=0; i<=29; i++)
{
start->C[i]=NULL;
start->nra[i]=0;
}
while (fin>>tip>>x)
{
if (tip==0)
addN(x);
else if (tip==1)
remV(x);
else if (tip==2)
{
caut(x);
}
else if (tip==3)
mi(x);
}
return 0;
}