Pagini recente » Cod sursa (job #122602) | Cod sursa (job #824491) | Diferente pentru concursuri-informatica intre reviziile 2 si 1 | Cod sursa (job #148303) | Cod sursa (job #3347878)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie_node{
int frec, cnt;
trie_node* copii[30];
trie_node() {
frec=cnt=0;
for(int i=0;i<30;i++)
copii[i]=nullptr;
}
};
trie_node* rad=new trie_node;
void adauga(string s){
trie_node* nod=rad;
nod->cnt++;
for(auto c: s){
if(nod->copii[c-'a'] == nullptr){
nod->copii[c-'a']=new trie_node;
}
nod=nod->copii[c-'a'];
nod->cnt++;
}
nod->frec++;
}
void sterge(string s){
trie_node* nod=rad;
nod->cnt--;
for(auto c: s){
nod=nod->copii[c-'a'];
nod->cnt--;
}
nod->frec--;
}
int getCount(string s){
trie_node* nod=rad;
for(auto c: s){
if(nod->copii[c-'a']==nullptr)
return 0;
nod=nod->copii[c-'a'];
}
return nod->frec;
}
int longestPref(string s){
trie_node* nod=rad;
int cnt=0;
for(auto c: s){
if(nod->copii[c-'a'] == nullptr){
break;
}
if(nod->copii[c-'a']->cnt==0)
break;
nod=nod->copii[c-'a'];
cnt++;
}
return cnt;
}
int main()
{
int t;
string s;
while(fin>>t>>s){
if(t==0){
adauga(s);
}
if(t==1){
sterge(s);
}
if(t==2){
fout<<getCount(s)<<'\n';
}
if(t==3){
fout<<longestPref(s)<<'\n';
}
}
return 0;
}