Pagini recente » Cod sursa (job #643624) | Cod sursa (job #1654520) | Cod sursa (job #121596) | Cod sursa (job #2353360) | Cod sursa (job #1690260)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
#define lsb(x) (-x)&(x)
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie{
int pref,cuv;
trie *next[27];
};
trie *T;
char s[1024];
int n;
#define code(x) (x-'a')
void ins(int pos,trie *T)
{
if(T->next[ code(s[pos]) ]==NULL)
T->next[ code(s[pos]) ]=new trie;
T=T->next[ code(s[pos]) ];
T->pref++;
if(pos==n-1)
T->cuv++;
else
ins(pos+1,T);
}
void del(int pos,trie *T)
{
T=T->next[ code(s[pos]) ];
T->pref--;
if(pos==n-1)
T->cuv--;
else
del(pos+1,T);
}
int countWords(int pos,trie* T)
{
if(T->next[ code(s[pos]) ]==NULL)
return 0;
T=T->next[ code(s[pos]) ];
if(pos==n-1)
return T->cuv;
else
return countWords(pos+1,T);
}
int pref;
void maxPref(int pos,trie *T)
{
if(T->next[ code(s[pos]) ]==NULL)
return;
T=T->next[ code(s[pos]) ];
if(T->pref >= 1)
pref++;
else
return;
if(pos!=n-1)
maxPref(pos+1,T);
}
int main()
{
T=new trie;
int t;
while(in>>t>>s)
{
n=strlen(s);
if(t==0)
ins(0,T);
else if(t==1)
del(0,T);
else if(t==2)
out<<countWords(0,T)<<'\n';
else{
pref=0;
maxPref(0,T);
out<<pref<<'\n';
}
}
return 0;
}