Pagini recente » Cod sursa (job #3256500) | Cod sursa (job #3203329) | Cod sursa (job #2718364) | Cod sursa (job #3237396) | Cod sursa (job #1697948)
#include <bits/stdc++.h>
#define cuv(x) (x-'a')
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
int prefix=0,cuvant=0;
Trie *next[26];
};
Trie *T;
char s[1024];
int n;
int pref;
void ins(int pos, Trie *T)
{
if(T->next[cuv(s[pos])]==NULL)
T->next[cuv(s[pos])]=new Trie;
T=T->next[cuv(s[pos])];
T->prefix++;
if(pos==n-1)
T->cuvant++;
else
ins(pos+1,T);
}
void del(int pos, Trie *T)
{
T=T->next[cuv(s[pos])];
T->prefix--;
if(pos==n-1)
T->cuvant--;
else
del(pos+1,T);
}
int words(int pos, Trie *T)
{
if(T->next[cuv(s[pos])]==NULL)
return 0;
T=T->next[cuv(s[pos])];
if(pos==n-1)
return T->cuvant;
else
return words(pos+1,T);
}
void maxPrefix(int pos, Trie *T)
{
if(T->next[cuv(s[pos])]==NULL)
return;
T=T->next[cuv(s[pos])];
if(T->prefix>=1)
pref++;
else
return;
if(pos!=n-1)
maxPrefix(pos+1,T);
}
int main()
{
T=new Trie;
int x;
while(in>>x>>s)
{
n=strlen(s);
if(x==0)
ins(0,T);
else if(x==1)
del(0,T);
else if(x==2)
out<<words(0,T)<<"\n";
else
{
pref=0;
maxPrefix(0,T);
out<<pref<<"\n";
}
}
in.close();
out.close();
return 0;
}