Pagini recente » Cod sursa (job #1595871) | Cod sursa (job #1123460) | Cod sursa (job #750947) | Cod sursa (job #2696043) | Cod sursa (job #2504756)
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
struct Trie {
int endw , cntfii;
Trie *fii [100];
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);
}
int lprf (Trie *node , char *p , int lmax){
if (! node -> fii [*p - 'a'])
return lmax;
return lprf (node -> fii [*p - 'a'] , p + 1 , lmax + 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 -> endw && ! node -> cntfii){
-- tata -> cntfii;
tata -> fii [* (p - 1) - 'a'] = NULL;
delete node;
}
}
int main()
{
int c;
while (f >> c >> s){
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 , 0) << '\n';
}
return 0;
}