Pagini recente » Cod sursa (job #2417650) | Cod sursa (job #2414388) | Cod sursa (job #2751396) | Cod sursa (job #1626500) | Cod sursa (job #2720515)
#include <fstream>
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
struct Trie {
int cnt, nr;
Trie* fiu[26];
Trie() {
cnt = nr = 0;
for(int i=0;i<26;i++) fiu[i] = 0;
}
};
char s[26];
Trie* T = new Trie;
int op;
void add(Trie* t, char* s) {
if(!(*s)) { t->cnt++; return; }
int ch = *s - 'a';
if(!t->fiu[ch]) t->nr++, t->fiu[ch] = new Trie;
add(t->fiu[ch], s + 1);
}
bool del(Trie* t, char* s) {
int ch = *s - 'a';
if(!(*s)) t->cnt--;
else if(del(t->fiu[ch], s + 1)) t->fiu[ch] = 0, t->nr--;
if(!t->nr and !t->cnt and !(t==T)) { delete t; return 1; }
return 0;
}
int findApp(Trie* t, char* s) {
if(!(*s)) return t->cnt;
int ch = *s - 'a';
if(t->fiu[ch]) return findApp(t->fiu[ch], s + 1);
return 0;
}
int longestCommonPrefix(Trie* t, char* s, int l = 0) {
int ch = *s - 'a';
if(!(*s) or !t->fiu[ch]) return l;
return longestCommonPrefix(t->fiu[ch], s + 1, l + 1);
}
void solve() {
switch(op) {
case 0:
add(T, s);
break;
case 1:
del(T, s);
break;
case 2:
fout<<findApp(T, s)<<'\n';
break;
case 3:
fout<<longestCommonPrefix(T, s)<<'\n';
break;
}
}
int main() {
while(fin>>op>>s) solve();
}