Pagini recente » Cod sursa (job #2699080) | Cod sursa (job #2284117) | Cod sursa (job #2752331) | Clasament simulare_oni_10_z1_2k13 | Cod sursa (job #2037705)
#include<bits/stdc++.h>
using namespace std;
struct nod{
int valpref;
int valapar;
nod *fiu[26];
nod(){
this->valpref = 0;
this->valapar = 0;
for(int i = 0; i <= 25; ++i){
this->fiu[i] = NULL;
}
}
};
nod *root = new nod();
ifstream f("trie.in");
ofstream g("trie.out");
string s;
void add(nod* node, int poz){
if(poz == s.size()) node->valapar ++;
else node->valpref ++;
if(poz == s.size()) return;
int lit = (int)s[poz] - 'a';
if(node->fiu[lit] == NULL) node->fiu[lit] = new nod();
add(node->fiu[lit], poz+1);
}
void erase(nod* node, int poz){
if(poz == s.size()) node->valapar--;
else node->valpref --;
if(poz == s.size()) return;
int lit = s[poz] - 'a';
erase(node->fiu[lit], poz+1);
}
int nrapar(nod* node, int poz){
if(poz == s.size()) return node->valapar;
int lit = s[poz]-'a';
if(node->fiu[lit] == NULL) return 0;
return nrapar(node->fiu[lit], poz+1);
}
int prefix(nod* node, int poz){
if(node->valpref == 0 && node->valapar == 0) return poz-1;
if(poz == s.size()) return poz;
int lit = s[poz]-'a';
if(node->fiu[lit] == NULL) return poz;
else return prefix(node->fiu[lit], poz+1);
}
int main(){
int cd;
while(f >> cd){
f >> s;
if(cd == 0){
add(root,0);
}
if(cd == 1){
erase(root, 0);
}
if(cd == 2){
g << nrapar(root, 0) << '\n';
}
if(cd == 3){
g << prefix(root, 0) << '\n';
}
}
}