Pagini recente » Cod sursa (job #2005030) | Cod sursa (job #165514) | Cod sursa (job #1128314) | Cod sursa (job #2004865) | Cod sursa (job #2912671)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("trie.in");
ofstream out ("trie.out");
struct trie
{
int cnt;
int prfx;
trie *f[26];
trie()
{
cnt = prfx = 0;
memset(f, 0, sizeof(f));
}
};
class Trie
{
protected:
trie *t;
public:
Trie()
{
t = new trie;
}
void ins (string s)
{
trie *p = t;
trie *q;
for (int i=0; i<s.size(); i++)
{
int ch = s[i] - 'a';
if (p -> f[ch] == NULL)
{
q = new trie;
p -> f[ch] = q;
}
p = p -> f[ch];
p -> prfx++;
}
p -> cnt++;
}
void del (string s)
{
trie*p = t;
for (int i=0; i<s.size(); i++)
{
int ch = s[i] - 'a';
p = p -> f[ch];
p -> prfx--;
}
p -> cnt--;
}
int cntap (string s)
{
trie *p = t;
for (int i=0; i<s.size(); i++)
{
int ch = s[i] - 'a';
if (p -> f[ch] == NULL)
return 0;
p = p -> f[ch];
}
return p -> cnt;
}
int prefix (string s)
{
trie *p = t;
int len = 0;
for (int i=0; i<s.size(); i++)
{
int ch = s[i] - 'a';
if (p -> f[ch] == NULL)
return len;
p = p -> f[ch];
if (p -> prfx == 0)
return len;
len++;
}
return len;
}
};
int main()
{
Trie t;
int op;
string s;
while (in >> op >> s)
{
if (op == 0)
t.ins(s);
else if (op == 1)
t.del(s);
else if (op == 2)
out << t.cntap(s) << '\n';
else
out << t.prefix(s) << '\n';
}
return 0;
}