Pagini recente » Diferente pentru runda/cni_preoji intre reviziile 10 si 11 | Cod sursa (job #1689940) | Diferente pentru runda/cni_preoji intre reviziile 12 si 9 | Monitorul de evaluare | Cod sursa (job #1754278)
#include <bits/stdc++.h>
using namespace std;
int c; string s;
struct Trie{
int nr, nrfii;
Trie *fii[26];
Trie(){
nr=0; nrfii=0;
for(int i=0;i<=26;i++) fii[i]=0;
}
};
Trie *T = new Trie;
void add(Trie *nod, string s, int p){
ifstream in("trie.in");
ofstream out("trie.out")
if(s[p]==0){
nod->nr++;
return;
}
else{
if(nod->fii[s[p]-'a']==0){
nod->fii[s[p]-'a'] = new Trie;
nod->nrfii++;
}
add(nod->fii[s[p]-'a'], s, p+1);
}
}
bool rem(Trie *nod, string s, int p){
if(s[p]==0){
nod->nr--;
}
else if(rem(nod->fii[s[p]-'a'],s,p+1)){
nod->nrfii--;
nod->fii[s[p]-'a']=0;
}
if(nod->nr==0 && nod->nrfii==0 && nod!=T){
delete nod; return 1;
}
return 0;
}
int qry(Trie *nod, string s, int p){
if(s[p]==0){
return nod->nr;
}
else{
if(nod->fii[s[p]-'a']==0) return 0;
else{
return qry(nod->fii[s[p]-'a'],s,p+1);
}
}
}
int lng(Trie *nod, string s, int p){
if(s[p]==0){
return p;
}
else{
if(nod->fii[s[p]-'a']==0) return p;
else{
return lng(nod->fii[s[p]-'a'],s,p+1);
}
}
}
int main()
{
in >> c >> s;
while(s[0]){
if(c==0) add(T,s,0);
else if(c==1) rem(T,s,0);
else if(c==2) out << qry(T,s,0) << '\n';
else if(c==3) out << lng(T,s,0) << '\n';
in >> c >> s;
}
}