Pagini recente » Borderou de evaluare (job #998630) | Borderou de evaluare (job #754245) | Borderou de evaluare (job #1227913) | Rezultatele filtrării | Cod sursa (job #1093005)
#include <fstream>
//#include <iostream>
//#include <cstring>
#include <cstdio>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int n, m, qk, lg;
char x[21];
struct tree
{
int n;
int out;
tree* v[27];
tree()
{
n=0;
out=0;
for(int i=0; i<=27; i++)
v[i]=0;
}
};
//vector <tree > t;
tree *ant2= new tree;
/*
void update_1(char a[])
{
tree ant=start;
for(int i=0; i<strlen(a)-1; i++)
{
tree asd;
if(ant.v[a[i]-'a'])
{
ant.v[a[i]-'a']=&asd;
ant.out++;
}
ant=asd;
}
ant.n++;
cout<<a<<' '<<&ant<<" ant.n:"<<ant.n<<'\n';
}*/
void update_1(tree *ant, char *a)
{
if(a[0]==0)
{
ant->n++;
return;
//cout<<a<<' '<<&ant<<" ant.n:"<<ant->n<<'\n';
}
else if(ant->v[a[0]-'a']==0)
{
ant->v[a[0]-'a']= new tree;
ant->out++;
}
update_1(ant->v[a[0]-'a'], a+1);
}
int update_2(tree *ant,char *a)
{
if(a[0]==0)
ant->n--;
else
if( update_2(ant->v[a[0]-'a'], a+1))
{ant->out--;
ant->v[a[0]-'a']=0;
}
if(ant->out==0 && ant->n==0 && ant!=ant2)
{
delete ant;
return 1;
}
return 0;
}
int querry_1(tree *ant,char *a)
{
if(a[0]==0)
return ant->n;
else if(ant->v[a[0]-'a']==0) return 0;
return querry_1(ant->v[a[0]-'a'], a+1);
}
int querry_2(tree *ant,char *a)
{
if(a[0]==0 || ant->v[a[0]-'a']==0)
return 0;
else return (querry_2(ant->v[a[0]-'a'],a+1)+1);
}
int main()
{
int k;
while(fin>>k>>x)
{
// tree *ant=new tree;
if(k==0)
update_1(ant2,x);
else if(k==1)
update_2(ant2, x);
else if(k==2)
fout<<querry_1(ant2,x)<<'\n';
else if(k==3)
fout<<querry_2(ant2,x)<<'\n';
}
fin.close();
fout.close();
return 0;
}