Pagini recente » Cod sursa (job #893735) | Borderou de evaluare (job #2903670) | Cod sursa (job #2206387) | Cod sursa (job #1786553) | Cod sursa (job #3262050)
#include <bits/stdc++.h>
using namespace std;
struct Trie {
int cnt;
Trie* next[26];
Trie() {
cnt = 0;
for(int i = 0; i < 26; i++) {
next[i] = NULL;
}
}
};
Trie *root;
void adaugare(string &s) {
Trie* p = root;
for(int i = 0; i < (int)s.size(); i++) {
int pos = s[i] - 'a';
if(p -> next[pos] == NULL) {
p -> next[pos] = new Trie();
}
p = p -> next[pos];
p -> cnt++;
}
}
int longestPrefix(string &s) {
Trie* p = root;
for(int i = 0; i < (int)s.size(); i++) {
int pos = s[i] - 'a';
if(p -> next[pos] == NULL || p -> next[pos] -> cnt == 0) {
return i;
}
p = p -> next[pos];
//p -> cnt++;
}
return s.size();
}
void stergere(string &s) {
Trie* p = root;
for(int i = 0; i < (int)s.size(); i++) {
int pos = s[i] - 'a';
// if(p -> next[pos] == NULL) {
// p -> next[pos] = new Trie();
// }
p = p -> next[pos];
p -> cnt--;
}
}
int nrAparitii(string &s) {
Trie* p = root;
for(int i = 0; i < (int)s.size(); i++) {
int pos = s[i] - 'a';
if(p -> next[pos] == NULL) {
return 0;
}
p = p -> next[pos];
//p -> cnt++;
}
int sum = 0;
for(int i = 0; i < 26; i++) {
if(p -> next[i] != NULL) {
sum += p -> next[i] -> cnt;
}
}
return p -> cnt - sum;
}
int main() {
ifstream f("trie.in");
ofstream g("trie.out");
root = new Trie();
int op;
string s;
while(f >> op >> s) {
if(op == 0) {
adaugare(s);
}
if(op == 1) {
stergere(s);
}
if(op == 2) {
g << nrAparitii(s) << '\n';
}
if(op == 3) {
g << longestPrefix(s) << '\n';
}
}
return 0;
}