Pagini recente » Cod sursa (job #1334127) | Cod sursa (job #1614276) | Cod sursa (job #2556889) | Cod sursa (job #2392554) | Cod sursa (job #1893268)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int N;
struct Trie { int nrFii,fii[26],cnt; };
vector<Trie> T;
Trie x;
void New()
{
T.push_back(x);
}
void Add(char *cuv,int nod)
{
if(*cuv=='\0')
{
T[nod].cnt++;
return;
}
int l=*cuv-'a',poz;
if(T[nod].fii[l]==0)
{
T[nod].nrFii++;
New();
poz=T[nod].fii[l]=T.size()-1;
}
else
poz=T[nod].fii[l];
Add(cuv+1,poz);
}
void Delete(char *cuv,int nod)
{
if(*cuv=='\0')
{
T[nod].cnt--;
return;
}
int l=*cuv-'a';
int fiu=T[nod].fii[l];
Delete(cuv+1,fiu);
if(T[fiu].cnt==0 && T[fiu].nrFii==0)
T[nod].nrFii--, T[nod].fii[l]=0;
}
int NrCuv(int nod,char *cuv)
{
if(*cuv=='\0')
return T[nod].cnt;
int l=*cuv-'a';
int fiu=T[nod].fii[l];
if(T[nod].fii[l]==0)
return 0;
return NrCuv(fiu,cuv+1);
}
int LungimePrefix(int nod,char *cuv,int k)
{
int l=*cuv-'a';
if(*cuv=='\0' || T[nod].fii[l]==0)
return k;
return LungimePrefix(T[nod].fii[l],cuv+1,k+1);
}
int main()
{
New();
int op; char c[100];
while(fin>>op>>c)
{
if(op==0) Add(c,0);
if(op==1) Delete(c,0);
if(op==2) fout<<NrCuv(0,c)<<"\n";
if(op==3) fout<<LungimePrefix(0,c,0)<<"\n";
}
return 0;
}