Pagini recente » Cod sursa (job #1694625) | Cod sursa (job #2835482) | Cod sursa (job #1752990) | Cod sursa (job #2223424) | Cod sursa (job #1326333)
#include<fstream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
typedef struct ttrie {
int nr,cuv;
ttrie *a[30];
ttrie() { memset(a,0,sizeof(a)); nr=cuv=0; }
}*trie;
int i,op,n;
trie root;
string s;
void Insert() {
int i;
trie aux=root;
for(i=0;i<n;++i)
{
if(!aux->a[s[i]-'a']) aux->a[s[i]-'a']=new ttrie;
aux=aux->a[s[i]-'a']; ++aux->nr;
}
++aux->cuv;
}
void Delete() {
int i;
trie aux=root;
for(i=0;i<n;++i)
aux=aux->a[s[i]-'a'],--aux->nr;
--aux->cuv;
}
int Query() {
int i;
trie aux=root;
for(i=0;i<n;++i)
{
if(!aux->a[s[i]-'a']) return 0;
aux=aux->a[s[i]-'a'];
}
return aux->cuv;
}
int Prefix() {
int i,rs=0;
trie aux=root;
for(i=0;i<n;++i)
{
if(!aux->a[s[i]-'a']) return rs;
aux=aux->a[s[i]-'a'];
if(!aux->nr) return rs;
++rs;
}
return rs;
}
int main()
{
ifstream cin("trie.in");
ofstream cout("trie.out");
getline(cin,s); root=new ttrie;
op=s[0]-'0'; s.erase(0,2); n=s.length();
while(n)
{
if(!op) Insert();
if(op==1) Delete();
if(op==2) cout<<Query()<<'\n';
if(op==3) cout<<Prefix()<<'\n';
getline(cin,s); n=s.length();
if(n) op=s[0]-'0',s.erase(0,2),n-=2;
}
return 0;
}