Pagini recente » Cod sursa (job #1263520) | Cod sursa (job #1881900) | Cod sursa (job #1465066) | Cod sursa (job #2240972) | Cod sursa (job #2582109)
#include <bits/stdc++.h>
#define ALPHABET_SIZE 26
using namespace std;
struct Trie
{
int vf, cntSons;
Trie* v[ALPHABET_SIZE];
Trie()
{
vf = cntSons = 0;
memset(v, 0, sizeof(v));
}
};
Trie *root = new Trie;
inline int getId(const char &c)
{
return c - 'a';
}
void push(const string &s)
{
Trie *nodeCurrent = root;
int idx = 0, n = s.length();
while(idx < n)
{
if(!nodeCurrent->v[getId(s[idx])])
{
nodeCurrent->cntSons++;
nodeCurrent->v[getId(s[idx])] = new Trie;
}
nodeCurrent = nodeCurrent->v[getId(s[idx])];
idx++;
}
nodeCurrent->vf++;
}
int pop(Trie *node, const string &s)
{
if(!s.length())
node->vf--;
else
{
string sCopy = s.substr(1, s.length());
if(pop(node->v[getId(s[0])], sCopy))
{
node->v[getId(s[0])] = 0;
node->cntSons--;
}
}
if(!node->cntSons && !node->vf && node != root)
{
delete node;
return 1;
}
return 0;
}
int nrAparitii(const string &s)
{
Trie *nodeCurrent = root;
int idx = 0, n = s.length();
while(nodeCurrent && idx < n)
{
nodeCurrent = nodeCurrent->v[getId(s[idx])];
idx++;
}
if(!nodeCurrent)return 0;
return nodeCurrent->vf;
}
int longestPrefix(const string &s)
{
Trie *nodeCurrent = root;
int idx = 0, n = s.length();
while(nodeCurrent && idx < n)
{
nodeCurrent = nodeCurrent->v[getId(s[idx])];
idx++;
}
if(nodeCurrent)return n;
return idx - 1;
}
int main()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
ios::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
srand(time(NULL));
int c;
string s;
while(fin >> c >> s)
{
if(c == 0)push(s);
else if(c == 1)pop(root, s);
else if(c == 2)fout << nrAparitii(s) << '\n';
else fout << longestPrefix(s) << '\n';
}
fin.close();
fout.close();
return 0;
}