Pagini recente » Cod sursa (job #1597978) | Cod sursa (job #442728) | Cod sursa (job #2439080) | Rating Berintan Daniel (northpole32) | Cod sursa (job #1672376)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <algorithm>
#include <cstring>
#define pb push_back
#define mp make_pair
#define INFILE "trie.in"
#define OUTFILE "trie.out"
using namespace std;
ifstream f(INFILE);
ofstream g(OUTFILE);
struct trie
{
int x,nrf;
trie* fiu[27];
trie()
{
x=nrf=0;
memset(fiu,0,sizeof(fiu));
}
}*vf=new trie;
int op;
char cuv[25];
void add(trie* nod, char* s)
{
if(s[0]==0)nod->x++;
else
{
if(!nod->fiu[s[0]-'a'])
{
nod->nrf++;
nod->fiu[s[0]-'a']=new trie;
}
add(nod->fiu[s[0]-'a'],s+1);
}
}
bool sterg(trie* nod, char*s)
{
if(s[0]==0)nod->x--;
else if(sterg(nod->fiu[s[0]-'a'],s+1))
{
nod->fiu[s[0]-'a']=0;
nod->nrf--;
}
if(nod->x==0&&nod->nrf==0&&nod!=vf)
{
delete nod; return 1;
}
return 0;
}
int caut(trie* nod, char* s)
{
if(s[0]==0)return nod->x;
if(nod->fiu[s[0]-'a'])return caut(nod->fiu[s[0]-'a'],s+1);
return 0;
}
int pref(trie* nod, char* s, int k)
{
if(s[0]==0||nod->fiu[s[0]-'a']==0)return k;
return pref(nod->fiu[s[0]-'a'],s+1,k+1);
}
int main()
{
while(f>>op>>cuv)
{
if(!op)add(vf,cuv);
else if(op==1)sterg(vf,cuv);
else if(op==2)g<<caut(vf,cuv)<<'\n';
else g<<pref(vf,cuv,0)<<'\n';
}
f.close();
g.close();
return 0;
}