Pagini recente » Cod sursa (job #229877) | Cod sursa (job #3258771)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
char litera;
int cuv;
vector <trie*> v;
trie(char lit){
litera = lit;
cuv = 0;
}
};
void ins(trie *root, char *cuv){
if(cuv[0]){
bool ok = 0;
for(auto &elem:root->v){
if(elem->litera == cuv[0]){
ok=1;
ins(elem, cuv+1);
break;
}
}
if(!ok){
root->v.push_back(new trie(cuv[0]));
ins(root->v.back(), cuv+1);
}
}else{
root->cuv++;
}
}
void rem(trie *root, char *cuv){
if(cuv[0]){
for(int i=root->v.size()-1; i>=0; i--){
if(root->v[i]->litera == cuv[0]){
rem(root->v[i], cuv+1);
if(root->v[i]->cuv == 0 && root->v[i]->v.size() == 0){
delete root->v[i];
root->v.erase(root->v.begin()+i);
}
break;
}
}
}else{
root->cuv--;
}
}
int apar(trie *root, char *cuv){
if(cuv[0]){
for(auto &elem:root->v){
if(elem->litera == cuv[0]){
return apar(elem, cuv+1);
}
}
}else{
return root->cuv;
}
}
int lpc(trie *root, char *cuv){
if(cuv[0]){
for(auto &elem:root->v){
if(elem->litera == cuv[0]){
return lpc(elem, cuv+1)+1;
}
}
return 0;
}else{
return 0;
}
}
void show(trie *root){
fout<<root->litera<<':'<<root->cuv<<'\n';
for(auto &elem:root->v)
show(elem);
}
char cuv[25];
int c,i;
trie *root = new trie('$');
int main()
{
while(fin>>c){
fin>>cuv;
if(c == 0){
ins(root, cuv);
}else if(c == 1){
rem(root, cuv);
}else if(c == 2){
fout<<apar(root,cuv)<<'\n';
}else{
fout<<lpc(root,cuv)<<'\n';
}
}
//show(root);
return 0;
}