Pagini recente » Cod sursa (job #634015) | Cod sursa (job #190502) | Cod sursa (job #2509182) | Cod sursa (job #2129627) | Cod sursa (job #2673993)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct trie {
int ap, fin;
trie* fii[26];
trie () {
ap = fin = 0;
for (int i = 0; i < 26; i++)
fii[i] = NULL;
}
}*root;
void add (string s) {
trie* p = root;
for (int i = 0; i < s.size(); i++) {
if (p->fii[s[i] - 'a'] == NULL)
p -> fii[s[i] - 'a'] = new trie;
p = p-> fii[s[i] - 'a'];
p->ap++;
}
p->fin++;
}
void Erase (string s) {
trie *p = root;
for (int i = 0; i < s.size(); i++) {
trie* p1 = p;
p = p->fii[s[i] - 'a'];
p->ap--;
if (p1 -> ap == 0)
delete p1;
else if (p -> ap == 0)
p1->fii[s[i] - 'a'] = NULL;
}
p->fin--;
if (p->ap == 0)
delete p;
}
int query1 (string s) {
trie* p = root;
for (int i = 0; i < s.size(); i++) {
if (p->fii[s[i] - 'a'] == NULL)
return 0;
p = p-> fii[s[i] - 'a'];
}
return p->fin;
}
int query2 (string s) {
trie* p = root;
for (int i = 0; i < s.size(); i++) {
if (p->fii[s[i] - 'a'] == NULL)
return i;
p = p-> fii[s[i] - 'a'];
}
return s.size();
}
int main()
{
root = new trie;
root->ap = 1;
int ch;
string s;
while (fin >> ch >> s) {
if (ch == 0)
add(s);
if (ch == 1)
Erase(s);
if (ch == 2)
fout << query1(s) << "\n";
if (ch == 3)
fout << query2(s) << "\n";
}
return 0;
}