Pagini recente » Cod sursa (job #684181) | Cod sursa (job #1826350) | Cod sursa (job #1739630) | Cod sursa (job #1655706) | Cod sursa (job #1855978)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int MAXL = 110;
struct Trie{
int nrfii, cnt;
int fii[26];
};
vector<Trie> T;
Trie x;
void New();
void Add( char *word, int nod );
void Delete( char *word, int nod );
int NrCuv( int nod, char *word );
int LungimePrefix( int nod, char *cuv, int k );
int main()
{
int N, i;
int x;
char c[MAXL];
New();
while ( fin >> x >> c )
{
if ( x == 0 ) Add(c, 0);
if ( x == 1 ) Delete(c, 0);
if ( x == 2 ) fout << NrCuv(0, c) << '\n';
if ( x == 3 ) fout << LungimePrefix(0, c, 0) << '\n';
}
fin.close();
fout.close();
return 0;
}
void New()
{
T.push_back(x);
}
void Add( char *word, int nod )
{
if ( *word == '\0' )
{
T[nod].cnt++;
return;
}
char l = *word - 'a';
int poz;
if ( T[nod].fii[l] == 0 )
{
T[nod].nrfii++;
New();
poz = T[nod].fii[l] = T.size() - 1;
}
else
poz = T[nod].fii[l];
Add(word + 1, poz);
}
void Delete( char *word, int nod )
{
if ( *word == '\0' )
{
T[nod].cnt--;
return;
}
int l = *word - 'a';
int fiu = T[nod].fii[l];
Delete(word + 1, fiu);
if ( T[fiu].cnt == 0 && T[fiu].nrfii == 0 )
T[nod].nrfii--, T[nod].fii[l] = 0;
}
int NrCuv( int nod, char *word )
{
if ( *word == '\0' )
{
return T[nod].cnt;
}
int l = *word - 'a';
int fiu = T[nod].fii[l];
if ( T[nod].fii[l] == 0 )
return 0;
return NrCuv(fiu, word + 1);
}
int LungimePrefix( int nod, char *cuv, int k )
{
int l = *cuv - 'a';
if ( *cuv == '\0' || T[nod].fii[l] == 0 )
return k;
return LungimePrefix(T[nod].fii[l], cuv + 1, k + 1);
}