Pagini recente » Diferente pentru utilizator/rodik_rody intre reviziile 42 si 62 | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1967584) | Cod sursa (job #2079040)
#include <fstream>
#include <string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int n, tip;
string sir;
struct node{
int info, complet;
node *v[26];
};
void add(node *r, int poz, string sir){
if(r->v[sir[poz] - 'a'] == NULL){
++ r->complet;
r->v[sir[poz] - 'a'] = new node;
for(int i = 0; i <= 26; ++ i)
r->v[sir[poz] - 'a']->v[i] = NULL;
}
if(poz < sir.size())
add(r->v[sir[poz] - 'a'], poz + 1, sir);
if(poz == sir.size())
r->info += 1;
}
int rmv(node *r, int poz, string sir){
int ok = 0;
if(poz < sir.size())
ok = rmv(r->v[sir[poz] - 'a'], poz + 1, sir);
if(poz == sir.size()){
r->info -= 1;
if(r->info == 0)
r->complet -= 1;
if(r->complet == 0)
return 0;
else
return 1;
}
if(ok == 0){
delete r->v[sir[poz] - 'a'];
r->v[sir[poz] - 'a'] = NULL;
r->complet -= 1;
}
return r->complet;
}
int cnt(node *r, int poz, string sir){
if(poz < sir.size() && r->v[sir[poz] - 'a'] == NULL)
return 0;
if(poz < sir.size())
return cnt(r->v[sir[poz] - 'a'], poz + 1, sir);
if(poz == sir.size())
return r->info;
}
int prefix(node *r, int poz, string sir, int nivel){
if(r->v[sir[poz] - 'a'] != NULL && poz <= sir.size())
return prefix(r->v[sir[poz] - 'a'], poz + 1, sir, nivel + 1);
return nivel;
}
int main()
{
node *r = new node;
for(int i = 0; i <= 26; ++ i)
r->v[i] = NULL;
while(f>>tip){
f>>sir;
if(tip == 0)
add(r, 0, sir);
if(tip == 1)
rmv(r, 0, sir);
if(tip == 2)
g<<cnt(r, 0, sir)<<'\n';
if(tip == 3)
g<<prefix(r, 0, sir, 0)<<'\n';
}
return 0;
}