Pagini recente » Cod sursa (job #1520597) | Cod sursa (job #2530069) | Concursul Mihai Patrascu 2013 | Cod sursa (job #2263056) | Cod sursa (job #2244757)
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
struct trie {
int f, cnt;
trie* child[26];
};
trie* root;
trie* getNode() {
trie* node = new trie;
node->f = node->cnt = 0;
for(int i = 0; i < 26; i++)
node->child[i] = NULL;
return node;
}
void insertT(trie* root, char* cuv) {
trie* node = root;
int l = strlen(cuv);
for(int i = 0; i < l; i++) {
if(node->child[cuv[i]-'a'] == NULL)
node->child[cuv[i]-'a'] = getNode();
node = node->child[cuv[i]-'a'];
++node->cnt;
}
++node->f;
}
int searchT(trie* root, char* cuv) {
trie* node = root;
int l = strlen(cuv);
int i = 0;
while(i < l && node->child[cuv[i]-'a'] != NULL) {
node = node->child[cuv[i]-'a'];
i++;
}
if(i == l)
return node->f;
else return 0;
}
int prefix(trie* root, char* cuv) {
trie* node = root;
int l = strlen(cuv);
int i = 0;
while(i < l && node->child[cuv[i]-'a'] != NULL) {
node = node->child[cuv[i]-'a'];
i++;
}
return i;
}
void deleteT(trie* root, char* cuv) {
trie* node = root;
trie* node2 = root;
int l = strlen(cuv);
for(int i = 0; i < l; i++) {
node2 = node->child[cuv[i]-'a'];
--node2->cnt;
if(node2->cnt == 0)
node->child[cuv[i]-'a'] = NULL;
if(node->cnt == 0)
delete node;
node = node2;
}
--node2->f;
}
int main() {
int op;
char cuv[21];
ifstream fin ("trie.in");
ofstream fout ("trie.out");
root = getNode();
root->cnt = 1;
while( fin >> op >> cuv) {
if(op == 0)
insertT(root,cuv);
else if(op == 1)
deleteT(root,cuv);
else if(op == 2)
fout << searchT(root,cuv);
else fout << prefix(root,cuv);
}
return 0;
}