Pagini recente » Cod sursa (job #3136464) | Cod sursa (job #724293) | Cod sursa (job #2114662) | Cod sursa (job #2569119) | Cod sursa (job #1344978)
#include <cstring>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct trie {
int f[26], cnt, nrf;
};
vector<trie> T;
string s;
ifstream in("trie.in");
ofstream out("trie.out");
inline void newnode() {
trie n;
n.cnt = n.nrf = 0;
memset(n.f, 0, sizeof(n.f));
T.push_back(n);
}
inline void ins(int p, int node) {
if(p == s.size()) {
++T[node].cnt;
++T[node].nrf;
}
else {
if(T[node].f[s[p] - 'a'] == 0) {
newnode();
T[node].f[s[p] - 'a'] = T.size() - 1;
}
ins(p + 1, T[node].f[s[p] - 'a']);
++T[node].nrf;
}
}
inline void del(int p, int node) {
if(p == s.size()) {
--T[node].cnt;
--T[node].nrf;
}
else {
if(T[node].f[s[p] - 'a'] == 0) {
newnode();
T[node].f[s[p] - 'a'] = T.size() - 1;
}
del(p + 1, T[node].f[s[p] - 'a']);
--T[node].nrf;
}
}
inline void print_no(int p, int node) {
if(p == s.size())
out << T[node].cnt << '\n';
else if(T[node].f[s[p] - 'a'] == 0)
out << 0 << '\n';
else print_no(p + 1, T[node].f[s[p] - 'a']);
}
inline void print_LCP(int p, int node, int sol) {
if(p == s.size() || T[node].f[s[p]-'a'] == 0 || T[T[node].f[s[p]-'a']].nrf == 0)
out << sol << '\n';
else
print_LCP(p + 1, T[node].f[s[p] - 'a'], sol + 1);
}
int main()
{
newnode();
newnode();
int op;
in >> op;
while(!in.eof()) {
in >> s;
if(op == 0)
ins(0, 1);
if(op == 1)
del(0, 1);
if(op == 2)
print_no(0, 1);
if(op == 3)
print_LCP(0, 1, 0);
in >> op;
}
return 0;
}