Pagini recente » Cod sursa (job #3272705) | Cod sursa (job #841080) | Cod sursa (job #3274686) | Cod sursa (job #3274207)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
int nrCuv, nrSons;
Nod* son[26];
Nod()
{
nrCuv = 0;
nrSons = 0 ;
memset(son, 0, sizeof(son));
}
};
Nod* T = new Nod;
string s;
void Add(Nod* id, int poz)
{
if (poz == s.size())
{
id->nrCuv++;
return;
}
if (id->son[s[poz] - 'a'] == 0)
{
id->son[s[poz] - 'a'] = new Nod;
id->nrSons++;
}
Add(id->son[s[poz] - 'a'], poz + 1);
}
bool Del(Nod* id, int poz)
{
if (poz == s.size())
id->nrCuv--;
else
{
if (Del(id->son[s[poz] - 'a'], poz + 1))
{
id->nrSons--;
id->son[s[poz] - 'a'] = 0;
}
}
if (id != T && id->nrCuv == 0 && id->nrSons == 0)
{
delete id;
return true;
}
return false;
}
int Count(Nod* id, int poz)
{
if (poz == s.size())
{
return id->nrCuv;
}
if (id->son[s[poz] - 'a'] == 0)
return 0;
else
return Count(id->son[s[poz] - 'a'], poz + 1);
}
int Prefix(Nod* id, int poz)
{
if (poz == s.size())
return poz;
if (id->son[s[poz] - 'a'] == 0)
return poz;
else
return Prefix(id->son[s[poz] - 'a'], poz + 1);
}
int main()
{
int cer;
while (fin >> cer >> s)
{
if (cer == 0)
{
Add(T, 0);
continue;
}
if (cer == 1)
{
Del(T, 0);
continue;
}
if (cer == 2)
{
fout << Count(T, 0) << '\n';
continue;
}
if (cer == 3)
{
fout << Prefix(T, 0) << '\n';
continue;
}
}
}