Pagini recente » Cod sursa (job #131373) | Cod sursa (job #482151) | Cod sursa (job #32893) | Cod sursa (job #2050699) | Cod sursa (job #1751667)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct node {
int am;
int en;
node* ve[30];
node() {
am = 0;
en = 0;
for(int i = 0; i < 30; i++)
ve[i] = NULL;
}
};
struct trie {
node *root;
trie() {
root = new node();
root->am = 123123123;
}
void add(string s) {
node *ro = root;
for(int i = 0; i < s.size(); i++) {
if(ro->ve[s[i]-'a'] == NULL)
ro->ve[s[i]-'a'] = new node();
ro = ro->ve[s[i]-'a'];
ro->am++;
}
ro->en++;
}
void rem(string s) {
node *ro = root;
node *te = ro;
stack<node*> del;
for(int i = 0; i < s.size(); i++) {
te = ro;
ro = ro->ve[s[i]-'a'];
ro->am--;
if(ro->am == 0) {
te->ve[s[i]-'a'] = NULL;
del.push(ro);
}
}
ro->en--;
while(!del.empty()) {
delete del.top();
del.pop();
}
}
int ap(string s) {
node *ro = root;
for(int i = 0; i < s.size(); i++) {
if(ro->ve[s[i]-'a'] == NULL)
return 0;
ro = ro->ve[s[i]-'a'];
}
return ro->en;
}
int ln(string s) {
node *ro = root;
for(int i = 0; i < s.size(); i++) {
if(ro->ve[s[i]-'a'] == NULL) {
return i;
}
ro = ro->ve[s[i]-'a'];
}
return s.size();
}
};
int T = 0;
int main() {
int t;
string S;
trie T;
while(in >> t) {
in >> S;
if(t == 0)
T.add(S);
if(t == 1)
T.rem(S);
if(t == 2)
out << T.ap(S) << '\n';
if(t == 3)
out << T.ln(S) << '\n';
}
return 0;
}