Pagini recente » Cod sursa (job #179730) | Cod sursa (job #203093) | Cod sursa (job #2875411)
#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define EPSILON 0.000001
using namespace std;
const ll NMAX = 1e5 + 5, INF = 1e18, MOD = 666013, MMAX = 1e2 + 5, inf = INT_MAX;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
int nrCuv, nrAp;
Nod *F[26];
Nod()
{
nrCuv = nrAp = 0;
for(int i = 0; i < 26; i++)
{
F[i] = NULL;
}
}
};
Nod *Trie;
void Add(char *s)
{
Nod *crt = Trie;
for(; *s != '\0'; s++)
{
int i = *s - 'a';
if(crt->F[i] == NULL)
{
crt->F[i] = new Nod();
}
crt = crt->F[i];
crt->nrAp++;
}
crt->nrCuv++;
}
int Count(char *s)
{
Nod *crt = Trie;
for(; *s != '\0'; s++)
{
int i = *s - 'a';
if(crt->F[i] == NULL)
{
return 0;
}
crt = crt->F[i];
}
return crt->nrCuv;
}
int Lcp(char *s)
{
int i, lg = 0;
Nod *crt = Trie;
for(; *s != '\0'; s++)
{
int i = *s - 'a';
if(crt->F[i] == NULL)
{
return lg;
}
++lg;
crt = crt->F[i];
}
return lg;
}
void Delete(char *s)
{
Nod *crt = Trie;
Nod *ant;
for(; *s != '\0'; s++)
{
int i = *s - 'a';
ant = crt;
crt = crt->F[i];
crt->nrAp--;
if(ant->nrAp == '\0')
{
delete ant;
}
else
{
if(crt->nrAp == '\0')
ant->F[i] = NULL;
}
}
crt->nrCuv--;
if(crt->nrAp == 0)
{
delete crt;
}
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int op;
char w[21];
Trie = new Nod();
Trie->nrAp = 1;
while(fin >> op >> w)
{
switch(op)
{
case 0:
Add(w);
break;
case 1:
Delete(w);
break;
case 2:
fout << Count(w) << '\n';
break;
case 3:
fout << Lcp(w) << '\n';
break;
}
}
return 0;
}