Pagini recente » Cod sursa (job #2791224) | Cod sursa (job #2723581) | Cod sursa (job #900607) | Cod sursa (job #892647) | Cod sursa (job #1697937)
#include <fstream>
#include <string.h>
#define cuv(x) (x-'a')
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
int prefix=0;
int cuvant=0;
Trie *next[27];
}*T;
char s[1000];
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++;
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)<<endl;
else
{
pref=0;
maxPrefix(0,T);
out<<pref<<endl;
}
}
in.close();
out.close();
return 0;
}