Pagini recente » Cod sursa (job #1946746) | Cod sursa (job #1523079) | Cod sursa (job #1154206) | Cod sursa (job #2637547) | Cod sursa (job #2608678)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
const int SIGMA = 26;
int Type, N;
char S[25];
struct Trie
{
int Ap;
int cnt;
Trie *Next[SIGMA];
Trie ()
{
Ap = cnt = 0;
for(int i = 0; i <= ('z' - 'a'); ++i)
Next[i] = nullptr;
}
} *p = new Trie;
static inline void Update (Trie *p, char *S, int q)
{
if((int)strlen(S) == 0)
{
p -> Ap += q;
return;
}
int Now = (int)(*S - 'a');
if(p -> Next[Now] == nullptr)
{
++(p -> cnt);
p -> Next[Now] = new Trie;
}
Update(p -> Next[Now], S + 1, q);
if(q == -1)
{
if(p -> Next[Now] -> Ap == 0 && p -> Next[Now] -> cnt == 0)
{
--(p -> cnt);
p -> Next[Now] = nullptr;
}
}
return;
}
static inline int Query (Trie *p, char *S)
{
int m = (int)strlen(S);
for(int i = 0; i < m; ++i)
{
int Now = (int)(S[i] - 'a');
if(p -> Next[Now] == nullptr)
return 0;
p = p -> Next[Now];
}
return p -> Ap;
}
static inline int LongestPrefix (Trie *p, char *S)
{
int r = 0;
int m = (int)strlen(S);
for(int i = 0; i < m; ++i)
{
int Now = (int)(S[i] - 'a');
if(p -> Next[Now] == nullptr)
break;
++r;
p = p -> Next[Now];
}
return r;
}
int main ()
{
f.tie(nullptr);
while(f >> Type >> (S + 1))
{
if(Type == 0)
Update(p, S + 1, 1);
else if(Type == 1)
Update(p, S + 1, -1);
else if(Type == 2)
g << Query(p, S + 1);
else
g << LongestPrefix(p, S + 1);
if(Type > 1)
g << '\n';
}
return 0;
}