Pagini recente » Cod sursa (job #566166) | Cod sursa (job #3299703) | Diferente pentru problema/coduri intre reviziile 11 si 10 | Cod sursa (job #3356239) | Cod sursa (job #2017380)
#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[30];
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->v[chr]) && 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]))
{
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])) 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;
}