Pagini recente » Cod sursa (job #66994) | Cod sursa (job #2668261) | Cod sursa (job #2065317) | Cod sursa (job #3164100) | Cod sursa (job #2843279)
#include <bits/stdc++.h>
using namespace std;
class Trie {
struct TrieNode {
map<char, unique_ptr<TrieNode> > nxt;
int wordCnt;
int prefixCnt;
TrieNode() {
wordCnt = 0;
prefixCnt = 0;
}
};
unique_ptr<TrieNode>root;
/*/
sau TrieNode *root;
/*/
public:
Trie() {
root = unique_ptr<TrieNode>(new TrieNode());
}
void modifyCnt(const string &s, int delta) {
TrieNode *T = root.get();
for(char c : s) {
if(T->nxt.find(c) == end(T->nxt)) {
T->nxt[c] = unique_ptr<TrieNode>(new TrieNode());
}
T = T->nxt[c].get();
T->prefixCnt += delta;
}
T->wordCnt += delta;
}
int getCnt(const string &s) {
TrieNode *T = root.get();
for(char c : s) {
if(T->nxt.find(c) == end(T->nxt)) {
return 0;
}
T = T->nxt[c].get();
}
return T->wordCnt;
}
int getLCP(const string &s) {
TrieNode *T = root.get();
int len = 0;
for(char c : s) {
if(T->nxt.find(c) == end(T->nxt)) {
return len;
}
T = T->nxt[c].get();
if(T->prefixCnt == 0)
return len;
len++;
}
return len;
}
};
int main() {
ifstream cin("trie.in");
ofstream cout("trie.out");
string line;
Trie T;
while(getline(cin, line)) {
string word = line.substr(2, line.size() - 2);
//cerr << word << endl;
if(line[0] == '0') {
T.modifyCnt(word, 1);
} else if(line[0] == '1') {
T.modifyCnt(word, -1);
} else if(line[0] == '2') {
cout << T.getCnt(word) << '\n';
}
else cout << T.getLCP(word) << '\n';
}
}