Pagini recente » Cod sursa (job #2779088) | Cod sursa (job #2673472) | Cod sursa (job #2787142) | Cod sursa (job #2713581) | Cod sursa (job #1370203)
///TRIE
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct Trie {
int num, numChild;
bool isRoot;
vector<Trie*> adj;
Trie(bool r) {
num = numChild = 0;
isRoot = r;
adj.resize(26);
for(int i=0; i<26; ++i)
adj[i] = NULL;
}
void _insert(string::iterator i, string::iterator j);
void _delete(string::iterator i, string::iterator j);
int _count(string::iterator i, string::iterator j);
int _getMaxPref(string::iterator i, string::iterator j);
};
void Trie::_insert(string::iterator i, string::iterator j) {
if(i == j) {
++num;
return;
}
if(adj[*i-'a'] == NULL) {
adj[*i-'a'] = new Trie(false);
++numChild;
}
adj[*i-'a']->_insert(i+1, j);
}
void Trie::_delete(string::iterator i, string::iterator j) {
if(i == j) {
--num;
///if(!num && !numChild)
///delete this;
return;
}
adj[*i-'a']->_delete(i+1, j);
if(!adj[*i-'a']->num && !adj[*i-'a']->numChild) {
delete adj[*i-'a'];
--numChild;
adj[*i-'a'] = NULL;
}
}
int Trie::_count(string::iterator i, string::iterator j) {
if(i == j)
return num;
if(adj[*i-'a'] == NULL)
return 0;
return adj[*i-'a']->_count(i+1, j);
}
int Trie::_getMaxPref(string::iterator i, string::iterator j) {
if(adj[*i-'a'] != NULL && i != j)
return adj[*i-'a']->_getMaxPref(i+1, j) + 1;
return 0;
}
int main() {
ifstream inStr("trie.in");
ofstream outStr("trie.out");
string w;
int tp;
Trie t(true);
while(inStr >> tp >> w) {
///inStr >> tp >> w;
switch(tp) {
case 0: t._insert(w.begin(), w.end()); break;
case 1: t._delete(w.begin(), w.end()); break;
case 2: outStr << t._count(w.begin(), w.end()) << '\n'; break;
case 3: outStr << t._getMaxPref(w.begin(), w.end()) << '\n'; break;
}
}
return 0;
}