Pagini recente » Cod sursa (job #617281) | Cod sursa (job #128663) | Cod sursa (job #1044122) | Cod sursa (job #1329593) | Cod sursa (job #2662117)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct Trie {
int nr, sf;
Trie *fiu[26];
Trie() {
nr = sf = 0;
for (int i = 0; i < 26; ++i)
fiu[i] = NULL;
}
} *T;
void adaug(string s, int semn) {
Trie *aux = T;
aux -> nr += semn;
for (int i = 0; i < s.size(); ++i) {
int c = s[i] - 'a';
if (aux -> fiu[c] == NULL) {
Trie* auxf = new Trie;
aux -> fiu[c] = auxf;
}
aux = aux -> fiu[c];
aux -> nr += semn;
}
aux -> sf += semn;
}
int nr_aparitii(string s) {
Trie *aux = T;
for (int i = 0; i < s.size(); ++i) {
int c = s[i] - 'a';
if(aux -> fiu[c] == NULL) {
return 0;
}
aux = aux -> fiu[c];
}
return aux -> sf;
}
int cmlpc(string s) {
int ans = 0;
Trie *aux = T;
for (int i = 0; i < s.size(); ++i) {
int c = s[i] - 'a';
if (aux -> fiu[c] == NULL)
return ans;
aux = aux -> fiu[c];
if (aux -> nr > 0 && i < s.size() - 1 || i == s.size() - 1 && aux -> nr > 1)
ans = i + 1;
}
return ans;
}
int main() {
int type;
string s = "";
T = new Trie;
while (fin >> type >> s) {
switch(type) {
case 0:
adaug(s, 1);
break;
case 1:
adaug(s, -1);
break;
case 2:
fout << nr_aparitii(s) << '\n';
break;
case 3:
fout << cmlpc(s) << '\n';
break;
}
}
return 0;
}