Pagini recente » Cod sursa (job #2339365) | Cod sursa (job #475283) | Cod sursa (job #1243510) | Cod sursa (job #565296) | Cod sursa (job #3146553)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int kS = 26;
struct trie {
struct Node {
int cnt, frq, link[kS];
Node(int cnt = 0, int frq = 0): cnt(cnt), frq(frq) {
memset(link, -1, sizeof(link));
}
};
const Node root = Node();
vector<Node> ptr;
trie() {
init();
}
void init() {
ptr.clear();
ptr.emplace_back(root);
}
void insert(const string &s, int idx = 0, int root = 0) {
int ord = s[idx] - 'a';
if(ptr[root].link[ord] == -1) {
ptr.emplace_back(Node());
ptr[root].link[ord] = ptr.size() - 1;
}
int nxt = ptr[root].link[ord];
ptr[nxt].frq++;
if(idx == (int) s.size() - 1) {
ptr[nxt].cnt++;
} else {
insert(s, idx + 1, nxt);
}
}
void erase(const string &s, int idx = 0, int root = 0) {
int ord = s[idx] - 'a';
int nxt = ptr[root].link[ord];
ptr[nxt].frq--;
if(idx == (int) s.size() - 1) {
ptr[nxt].cnt--;
} else {
erase(s, idx + 1, nxt);
}
}
int count(const string &s, int idx = 0, int root = 0) {
int ord = s[idx] - 'a';
if(ptr[root].link[ord] == -1) {
return 0;
}
int nxt = ptr[root].link[ord];
if(ptr[nxt].frq == 0) {
return 0;
}
if(idx == (int) s.size() - 1) {
return ptr[nxt].cnt;
}
return count(s, idx + 1, nxt);
}
int prefix(const string &s, int idx = 0, int root = 0) {
int ord = s[idx] - 'a';
if(ptr[root].link[ord] == -1) {
return idx;
}
int nxt = ptr[root].link[ord];
if(ptr[nxt].frq == 0) {
return idx;
}
if(idx == (int) s.size() - 1) {
return s.size();
}
return prefix(s, idx + 1, nxt);
}
};
int main() {
int t;
string s;
trie ds;
while(fin >> t >> s) {
if(t == 0) {
ds.insert(s);
} else if(t == 1) {
ds.erase(s);
} else if(t == 2) {
fout << ds.count(s) << '\n';
} else if(t == 3) {
fout << ds.prefix(s) << '\n';
}
}
return 0;
}