Pagini recente » Cod sursa (job #2751167) | Cod sursa (job #1604870) | Cod sursa (job #1673484) | Cod sursa (job #2243050) | Cod sursa (job #1228647)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
struct trie
{
int urm[26],x,nr;
}aux;
vector<trie>v;
char s[20];
int x;
void adauga_elimina(char s[20],int a)
{
int nod=0,i;
for(i=0;i<strlen(s);i++)
{
v[nod].nr+=a;
if(v[nod].urm[s[i]-'a']==0)
{
v.push_back(aux);
v[nod].urm[s[i]-'a']=v.size()-1;
nod=v.size()-1;
}
else nod=v[nod].urm[s[i]-'a'];
}
v[nod].x+=a;
v[nod].nr+=a;
}
int nraparitii(char s[20])
{
int nod=0,i;
for(i=0;i<strlen(s) && v[nod].urm[s[i]-'a'];i++) nod=v[nod].urm[s[i]-'a'];
if(i<strlen(s)) return 0;
else return v[nod].x;
}
int prefix(char s[20])
{
int nod=0,i,sol=0;;
for(i=0;i<strlen(s);i++)
{
if(v[nod].nr==0) break;
sol=i;
if(v[nod].urm[s[i]-'a']) nod=v[nod].urm[s[i]-'a'];
else break;
}
return sol;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
v.push_back(aux);
while(!feof(stdin))
{
scanf("%d %s\n",&x,s);
if(x==0) adauga_elimina(s,1);
else if(x==1) adauga_elimina(s,-1);
else if(x==2) printf("%d\n",nraparitii(s));
else printf("%d\n",prefix(s));
}
return 0;
}