Pagini recente » Cod sursa (job #507921) | Cod sursa (job #1017557) | Cod sursa (job #879504) | Cod sursa (job #352212) | Cod sursa (job #2673989)
#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--;
}
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;
char 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;
}