Pagini recente » Cod sursa (job #2961240) | Cod sursa (job #293595) | Cod sursa (job #2246698) | Cod sursa (job #866833) | Cod sursa (job #2504779)
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
struct Trie {
int endw , cntfii;
Trie *fii [26];
Trie (){
endw = cntfii = 0;
memset (fii , 0 , sizeof (fii));
}
};
Trie *start = new Trie;
char s [100];
void add (Trie *node , char *p){
char o = *p - 'a';
if (! isalpha (*p)){
++ node -> endw;
return;
}
if (! node -> fii [o])
node -> fii [o] = new Trie , ++ node -> cntfii;
add (node -> fii [o] , p + 1);
}
int isw (Trie *node , char *p){
char o = *p - 'a';
if (! isalpha (*p))
return node -> endw;
if (! node -> fii [o])
return 0;
isw (node -> fii [o] , p + 1);
return 0;
}
int lprf (Trie *node , char *p){
if (! isalpha (*p) || ! node -> fii [*p - 'a'])
return 0;
return 1 + lprf (node -> fii [*p - 'a'] , p + 1 );
}
void del (Trie *node , char *p , Trie *tata){
if (! isalpha (*p)){
-- node -> endw;
if (! node -> endw && ! node -> cntfii){
-- tata -> cntfii;
tata -> fii [* (p - 1) - 'a'] = NULL;
delete node;
}
return;
}
del (node -> fii [*p - 'a'] , p + 1 , node);
if (node == start)
return;
if (! node -> endw && ! node -> cntfii){
-- tata -> cntfii;
tata -> fii [* (p - 1) - 'a'] = NULL;
delete node;
}
}
int main()
{
int c;
while (f >> c >> s){
s [strlen (s)] = '\n';
if (c == 0)
add (start , s);
if (c == 2)
g << isw (start , s) << '\n';
if (c == 1)
del (start , s , start);
if (c == 3)
g << lprf (start , s) << '\n';
}
return 0;
}