Pagini recente » Cod sursa (job #1730219) | Cod sursa (job #247747) | Cod sursa (job #1962962) | Cod sursa (job #1463902) | Cod sursa (job #2694719)
#include<fstream>
#define Q ( S[i] - 'a' )
#define ui (unsigned int);
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct Trie
{
int end, son;
Trie *F[26]; // Vector de adreselor fiilor
Trie()
{
end=son=0;
for(int i=0; i<26; i++) F[i]=0;
//memset( F, 0, sizeof( F ) );
}
};
Trie *T = new Trie;
string S;
void add(Trie *nod, ui i)
{
if(i==S.length()) {nod->end++; return;}
if(nod->F[Q]==0)
{
nod->F[Q]= new Trie; //Atribuirea unei adrese
nod->son++;
}
add(nod->F[Q], i+1);
}
int del(Trie *nod, ui i)
{
if(i==S.length()) nod->end--;
else
if( del(nod->F[Q], i+1 ) )
{
nod->F[Q] = 0;
nod->son --;
}
if( nod->end == 0 && nod->son == 0 && nod != T )
{
delete nod; return 1;
}
return 0;
}
int query(Trie *nod, ui i)
{
if(i==S.length()) return nod->end;
if(nod->F[Q]) return query(nod->F[Q], i+1);
return 0;
}
int prefix(Trie *nod, ui i, int k)
{
if(i==S.length() || nod->F[Q]==0) return k;
return prefix(nod->F[Q], i+1, k+1);
}
int main()
{
int q;
while(fi >> q)
{
fi >> S;
switch(q)
{
case 0: add( T, 0); break;
case 1: del( T, 0); break;
case 2: fo << query( T, 0) << '\n'; break;
case 3: fo << prefix( T, 0, 0) << '\n'; break;
}
}
return 0;
}