Cod sursa(job #1467401)

Utilizator SilviuIIon Silviu SilviuI Data 3 august 2015 12:53:52
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <time.h>
#include <bitset>
#include <string>
#include <vector>
#include <math.h>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <limits.h>
#include <algorithm>
#include <deque>
#define nmax 100010
#define mod 1999999973
using namespace std;
struct trie { int c,l; trie *f[26];
       trie() {
           c=0; l=0;
           for (int i=0;i<26;i++) f[i]=NULL;
       }
};
int n,i,tip;
char s[25];
trie *root;
void add_word()
{
    int i=1; trie *a=root;
    while (i<=n && a->f[s[i]-97]!=NULL) a=a->f[s[i]-97],a->l++,i++;
    for (;i<=n;i++) {
        a->f[s[i]-97]=new trie; a=a->f[s[i]-97]; a->l=1;
    }
    a->c++;
}
void delete_word()
{
    int i=1; trie *a=root;
    while (i<=n && a->f[s[i]-97]!=NULL) {
        if (a->f[s[i]-97]->l==1) { a->f[s[i]-97]=NULL; return; } else
            {
                 a=a->f[s[i]-97]; a->l--; i++;
            }
    }
    if (i>n) a->c--;
}
int nrword()
{
    int i=1; trie *a=root;
    while (i<=n && a->f[s[i]-97]!=NULL) a=a->f[s[i]-97],i++;
    if (i>n) return (a->c); else return 0;
}
int longestprefix()
{
    int i=1; trie *a=root;
    while (i<=n && a->f[s[i]-97]!=NULL) a=a->f[s[i]-97],i++;
    return (i-1);
}
int main() {
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
root=new trie;
while (!feof(stdin)) {
    scanf("%d ",&tip); gets(s+1); n=strlen(s+1);
    switch (tip) {
        case 0:{ add_word(); break; }
        case 1:{ delete_word(); break; }
        case 2:{ printf("%d\n",nrword()); break; }
        case 3:{ printf("%d\n",longestprefix()); break; }
    }
}
return 0;
}