Pagini recente » Cod sursa (job #3243049) | Cod sursa (job #1189566) | Cod sursa (job #2214970) | Cod sursa (job #1076255) | Cod sursa (job #1336111)
#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(string w) {
Trie *t = T;
int sz = w.size();
for(int i = 0; i < sz; i++) {
if(t->sons[CH] == 0) {
t->sons[CH] = new Trie();
t->num_sons++;
}
t = t->sons[CH];
}
t->word_freq++;
}
int delWord(Trie *t, string s) {
if(s == "") {
t->word_freq--;
}
else if(delWord(t->sons[s[0] - 'a'], s.substr(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(string w) {
Trie *t = T;
int sz = w.size();
for(int i = 0; i < sz; i++) {
if(t->sons[CH] == 0) {
return 0;
}
t = t->sons[CH];
}
return t->word_freq; // t->sons[w[sz - 1] - 'a']->word_freq;
}
int prefWord(string w) {
Trie *t = T;
int cnt = 0;
int sz = w.size();
for(int i = 0; i < sz; i++) {
if(t->sons[CH] == 0) {
break;
}
t = t->sons[CH];
cnt++;
}
return cnt;
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out","w", stdout);
int id;
string w;
T = new Trie();
while(cin >> id >> w) {
switch(id) {
case 0:
insWord(w);
break;
case 1:
delWord(T, w);
break;
case 2:
cout << queWord(w) << "\n";
break;
case 3:
cout << prefWord(w) << "\n";
break;
}
}
return 0;
}