Pagini recente » Cod sursa (job #3275655) | Borderou de evaluare (job #2688361) | Cod sursa (job #85288) | Monitorul de evaluare | Cod sursa (job #2017381)
#include <bits/stdc++.h>
#define chr *s-'a'
using namespace std;
ifstream F("trie.in");
ofstream G("trie.out");
struct trie
{
int k, fiu;
trie *v[26];
trie()
{
k = fiu = 0;
for(int i = 0; i <= 25; ++ i) v[i] = 0;
}
};
int x;char s[35];trie *T=new trie;
int Del(trie *nod, char *s)
{
if(chr < 0) nod->k--;
else if(Del(nod->v[chr], s+1))
{
nod->v[chr] = 0;
nod->fiu--;
}
if(nod->k==0 && nod != T && !(nod->fiu)) {delete nod; return 1;}
return 0;
}
void Ins(trie *nod, char *s)
{
if(chr < 0) {nod->k++; return;}
if(nod->v[chr]==0)
{
nod->v[chr]=new trie;
nod->fiu++;
}
Ins(nod->v[chr], s+1);
}
int Pref(trie *nod, char*s, int ans)
{
if(chr < 0 || nod->v[chr]==0) return ans;
return Pref(nod->v[chr], s+1, ans+1);
}
int Ap(trie *nod, char *s)
{
if(chr < 0) return nod->k;
if(nod->v[chr]) return Ap(nod->v[chr], s+1);
return 0;
}
int main()
{
while(F >> x)
{
F.get();
F.get(s, 30);
if(!x) Ins(T, s);
else if(x == 1) Del(T, s);
else if(x == 2) G << Ap(T, s) << '\n';
else G << Pref(T, s, 0) << '\n';
}
return 0;
}