Pagini recente » Cod sursa (job #1424659) | Cod sursa (job #755) | Cod sursa (job #1094) | Cod sursa (job #2952789) | Cod sursa (job #1754472)
#include <bits/stdc++.h>
using namespace std;
ofstream g("trie.out");
struct Nod
{
int nr, cnt;
Nod *leg[27];
};
Nod *L;
void Init()
{
L = new Nod;
L->nr = 0;
for(int i = 0; i < 26; i++)
{
L->leg[i] = NULL;
L->cnt = 0;
}
}
void InsCuv(const char c[])
{
char cc;
Nod *p, *q;
p = L;
for(int i = 0; c[i] != 0 ; i++)
{
cc = c[i];
int j = cc - 'a';
if(p->leg[j] != NULL)
{
p->cnt++;
p = p->leg[j];
}
else
{
q = new Nod;
q->nr = 0;
q->cnt = 1;
for(int k = 0; k < 26; k++)
q->leg[k] = NULL;
p->leg[j] = q;
p = q;
}
}
p->nr++;
p->cnt++;
}
void StergeCuv(const char c[])
{
Nod *p;
p = L;
char cc;
for(int i = 0; c[i]; i++)
{
cc = c[i];
int j = cc - 'a';
p->cnt--;
p = p->leg[j];
}
p->nr--;
p->cnt--;
}
int NrAp(const char c[])
{
Nod *p;
p = L;
for(int i = 0; c[i]; i++)
{
int j = c[i] - 'a';
if(p->leg[j] == NULL)
return 0;
p = p->leg[j];
}
return p->nr;
}
int Prefix(const char c[])
{
Nod *p;
int lung = 0;
p = L;
for(int i = 0; c[i]; i++)
{
int j = c[i] - 'a';
if(p->cnt == 0 || p->leg[j] == NULL)
return lung;
lung++;
p = p->leg[j];
}
return lung;
}
void Citire()
{
ifstream f("trie.in");
Init();
int op;
char ch[27];
while(f >> op >> ch)
{
if(op == 0) InsCuv(ch);
if(op == 1) StergeCuv(ch);
if(op == 2) g << NrAp(ch) << "\n";
if(op == 3) g << Prefix(ch) << "\n";
}
f.close();
g.close();
}
int main()
{
Citire();
return 0;
}