Cod sursa(job #1111169)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 18 februarie 2014 17:52:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<cstring>
using namespace std;
int op,n,i,l; char s[30];
struct trie
{
    int count,was;
    trie *fiu[30];
    trie()
    {
        count=was=0;
        memset(fiu,0,sizeof(fiu));
    }
};
trie *root=new trie;
void a(trie *T, int poz)
{
    if(poz==n) {T->count++; return;}
    l=s[poz]-'a';
    if(!T->fiu[l]) T->fiu[l]=new trie;
    T->fiu[l]->was++;
    a(T->fiu[l],poz+1);
}
void d(trie *T, int poz)
{
    if(poz==n) {T->count--; return;}
    l=s[poz]-'a';
    T->fiu[l]->was--;
    d(T->fiu[l],poz+1);
}
void c(trie *T,int poz)
{
    if(poz==n) {printf("%d\n",T->count); return;}
    l=s[poz]-'a';
    if(!T->fiu[l] || !T->fiu[l]->was) {printf("0\n"); return;}
    c(T->fiu[l],poz+1);
}
void p(trie *T,int poz)
{
    if(poz==n) {printf("%d\n",n); return;}
    l=s[poz]-'a';
    if(!T->fiu[l] || !T->fiu[l]->was) {printf("%d\n",poz); return;}
    p(T->fiu[l],poz+1);
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	while(scanf("%d %s",&op,s)+1)
	{
	    n=strlen(s);
	    if(op==0) a(root,0);
	    else if(op==1) d(root,0);
	    else if(op==2) c(root,0);
	    else p(root,0);
	}
	return 0;
}