Pagini recente » Cod sursa (job #2606874) | Cod sursa (job #813948) | Cod sursa (job #2785758) | Cod sursa (job #2669073) | Cod sursa (job #1115861)
#include<cstdio>
#include<cstring>
using namespace std;
int t , N;
char s[22];
struct nod
{
int cuv , pre;
nod *fiu[26];
nod()
{
cuv = pre = 0;
memset(fiu,0,sizeof(fiu));
}
};
nod *rad = new nod();
void add(nod *q, int i);
int query(nod *q , int i);
void del(nod *q , int i);
int prefix(nod *q, int i,int k);
int main()
{
freopen("trie.in" , "r" , stdin );
freopen("trie.out" , "w" , stdout );
while(scanf("%d %s" , &t , s+1) >0)
{
N = strlen(s+1);
if(t == 0)add(rad,0);
if(t == 1)del(rad,0);
if(t == 2)printf("%d\n" , query(rad,0));
if(t == 3)printf("%d\n" , prefix(rad,0,0));
}
return 0;
}
void add(nod *q, int i)
{
if(q != rad)q->pre++;
if(i == N){q->cuv++;return;}
if(!q->fiu[s[i+1]-'a'])q->fiu[s[i+1]-'a'] = new nod();
add(q->fiu[s[i+1]-'a'],i+1);
}
int query(nod *q , int i)
{
if(!q)return 0;
if(i == N)return q->cuv;
return query(q->fiu[s[i+1]-'a'],i+1);
}
void del(nod *q ,int i)
{
if(q != rad)q->pre--;
if(i == N)q->cuv--;
if(i < N)del(q->fiu[s[i+1]-'a'],i+1);
}
int prefix(nod *q,int i, int k)
{
if(i == N || !q -> fiu[s[i+1]-'a'] || !q->fiu[s[i+1]-'a']->pre)return k;
return prefix(q->fiu[s[i+1]-'a'],i+1, k+1);
}