Pagini recente » Cod sursa (job #22207) | Cod sursa (job #2751137) | Cod sursa (job #239174) | Cod sursa (job #1120860) | Cod sursa (job #2721809)
#include <fstream>
#include <vector>
//#include <array>
using namespace std;
struct Trie
{
int nrCuv; ///Numărul de cuvinte care se termină în nodul curent
int nrFii;
unsigned char v[26];
Trie()
{
nrFii = 0;
nrCuv = 0;
for(int i = 0; i < 26; ++i)
v[i] = 0;
}
};
vector <Trie> arb;
ifstream f("trie.in");
ofstream g("trie.out");
void Add(char *s)
{
int nod = 0, k;
for(int i = 0; s[i] != 0; ++i)
{
k = s[i] - 'a';
if(arb[nod].v[k] == 0)
{
arb.push_back(Trie());
arb[nod].v[k] = arb.size() - 1;
}
nod = arb[nod].v[k];
arb[nod].nrFii++;
}
arb[nod].nrCuv++;
}
void Delete(char *s)
{
int nod = 0;
for(int i = 0; s[i] != 0; ++i)
{
nod = arb[nod].v[s[i] - 'a'];
arb[nod].nrFii--;
}
arb[nod].nrCuv--;
}
int Count(char *s)
{
int nod = 0;
for(int i = 0; s[i] != 0; ++i)
{
nod = arb[nod].v[s[i] - 'a'];
if(arb[nod].nrFii == 0)
return 0;
}
return arb[nod].nrCuv;
}
int Lcp(char *s)
{
int nod = 0, i;
for(i = 0; s[i] != 0; ++i)
{
nod = arb[nod].v[s[i] - 'a'];
if(arb[nod].nrFii == 0)
return i;
}
return i;
}
int main()
{
int op;
char w[21];
arb.push_back(Trie());
while(f >> op >> w)
{
switch(op)
{
case 0:
Add(w);
break;
case 1:
Delete(w);
break;
case 2:
g << Count(w) << '\n';
break;
case 3:
g << Lcp(w) << '\n';
//break;
}
}
return 0;
}