Pagini recente » Cod sursa (job #1767972) | Cod sursa (job #2011834) | Cod sursa (job #1440848) | Cod sursa (job #3194417) | Cod sursa (job #1146604)
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct vertex {
short letter;
int fii;
int words;
int pas;
vertex *litera[26];
vertex *tata;
};
short n;
string s;
vertex *origine;
void initialise(vertex* x) {
x->letter = -1;
x->fii = 0;
x->words = 0;
x->pas = 0;
for(int i = 0; i < 26; i++) {
x->litera[i] = NULL;
}
x->tata = NULL;
}
void addword(vertex* x, string word) {
if(word == "") {
x->words++;
}else {
short k = (short) word[0] - 97;
if(x->litera[k] == NULL) {
vertex *aux;
aux = new vertex;
initialise(aux);
aux->pas = x->pas + 1;
aux->tata = x;
aux->letter = k;
x->litera[k] = aux;
x->fii++;
}
addword(x->litera[k], word.substr(1));
}
}
vertex* Find(vertex* x, string word) {
if(word != "") {
short k = (short) word[0] - 97;
if(x->litera[k] == NULL) {
vertex *aux;
aux = new vertex;
aux->words = -1;
aux->pas = x->pas;
return aux;
}else {
return Find(x->litera[k], word.substr(1));
}
} else {
return x;
}
}
void delword(vertex* x, string word) {
vertex *aux;
aux = new vertex;
aux = Find(x, word);
int dist = aux->pas;
aux->words--;
vertex *tata;
tata = new vertex;
bool ok = 1;
while(ok) {
tata = aux->tata;
if((aux->fii == 0) && (aux->words == 0)) {
tata->litera[aux->letter] = NULL;
delete aux;
tata->fii--;
}else {
ok = 0;
}
aux = tata;
if(aux == origine) {
ok = 0;
}
}
}
int countword(vertex* x, string word) {
if(word == "") {
return x->words;
}else {
short k = (short) word[0] - 97;
if(x->litera[k] != NULL) {
return countword(x->litera[k], word.substr(1));
}else {
return 0;
}
}
}
int main() {
origine = new vertex;
initialise(origine);
while(fin >> n) {
fin >> s;
if(n == 0) {
addword(origine, s);
}
if(n == 1) {
delword(origine, s);
}
if(n == 2) {
fout << countword(origine, s) << '\n';
}
if(n == 3) {
fout << Find(origine, s)->pas << '\n';
}
}
fin.close();
fout.close();
return 0;
}