Cod sursa(job #2397832)
Utilizator | Data | 4 aprilie 2019 19:57:54 | |
---|---|---|---|
Problema | Trie | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.02 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
inline int nr(char ch)
{
return int(ch-'a');
}
struct Trie
{
int cuv;
int cnt;
Trie *fii[26];
Trie()
{
cnt=0;
cuv=0;
for(int i=0;i<26;i++)
fii[i]=NULL;
}
};
Trie *T = new Trie;
pair< Trie* , int > st[100010];
char w[25];
int op;
int main()
{
while(f>>op)
{
f>>w;
if(op==0)
{
char *p;
Trie *r;
for(p=w,r=T;p;p++)
{
int i=nr(*p);
r->cuv++;
if(!r->fii[i])r->fii[i]=new Trie;
r=r->fii[i];
}
r->cnt++;
r->cuv++;
}
if(op==1)
{
int i,k=0;
char *p;
Trie *r;
for(p=w,r=T;p;p++)
{
i=nr(*p);
r->cuv--;
st[++k]=make_pair(r,i);
r=r->fii[i];
}
r->cnt--;
r->cuv--;
for(k--;k>=1;k--)
{
Trie *rfiu;
tie(r,i)=st[k];
rfiu=r->fii[i];
if(rfiu->cuv==0)
{
r->fii[i]=NULL;
delete(rfiu);
}
}
}
if(op==2)
{
char *p;
Trie *r;
int i;
for(p=w,r=T;p;p++)
{
i=nr(*p);
if(!r->fii[i])break;
}
if(*p)g<<"0\n";
else g<<(r->cuv)<<'\n';
}
if(op==3)
{
int i,prefix=0;
char *p;
Trie *r;
for(p=w,r=T;p;p++)
{
i=nr(*p);
if(!r->fii[i])break;
prefix++;
}
g<<prefix<<'\n';
}
}
return 0;
}