Pagini recente » Cod sursa (job #1156929) | Cod sursa (job #1366543) | Cod sursa (job #683044) | Cod sursa (job #1214736) | Cod sursa (job #1336332)
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <string>
#include <ctime>
#include <cassert>
#include <utility>
#define CH (w[i] - 'a')
using namespace std;
struct Trie {
int word_freq, num_sons;
Trie *sons[26];
Trie() {
word_freq = 0;
num_sons = 0;
memset(sons, 0, sizeof(sons));
}
};
Trie *T;
void insWord(char *w) {
Trie *t = T;
int i = 0;
while(w[i] != '\n' && w[i] != '\0') {
if(t->sons[CH] == 0) {
t->sons[CH] = new Trie();
t->num_sons++;
}
t = t->sons[CH];
i++;
}
t->word_freq++;
}
int delWord(Trie *t, char *s) {
if(s[0] == '\n' || s[0] == '\0') {
t->word_freq--;
}
else if(delWord(t->sons[s[0] - 'a'], s + 1)) {
t->sons[s[0] - 'a'] = 0;
t->num_sons--;
}
if(t->num_sons == 0 && t->word_freq == 0 && t != T) {
delete t;
return 1;
}
return 0;
}
int queWord(char *w) {
Trie *t = T;
int i = 0;
while(w[i] != '\n' && w[i] != '\0') {
if(t->sons[CH] == 0) {
return 0;
}
t = t->sons[CH];
i++;
}
return t->word_freq; // t->sons[w[sz - 1] - 'a']->word_freq;
}
int prefWord(char *w) {
Trie *t = T;
int cnt = 0;
int i = 0;
while(w[i] != '\n' && w[i] != '\0') {
if(t->sons[CH] == 0) {
break;
}
t = t->sons[CH];
cnt++;
i++;
}
return cnt;
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out","w", stdout);
T = new Trie();
char s[30];
while(fgets(s, sizeof(s), stdin) != NULL) {
switch(s[0] - '0') {
case 0:
insWord(s + 2);
break;
case 1:
delWord(T, s + 2);
break;
case 2:
cout << queWord(s + 2) << "\n";
break;
case 3:
cout << prefWord(s + 2) << "\n";
break;
}
}
return 0;
}