Cod sursa(job #1802303)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 10 noiembrie 2016 08:59:16
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>

using namespace std;

#define maxn 100010
#define maxl 25

int cmp1 (int x, int y);
int cmp2 (int x, int y);

int n;
char cuv[maxn][maxl];
int len[maxn], p[maxn], q[maxn], nr[maxn];
int tip[maxn];
set <int> S;
int i, v1, v2;
set <int> :: iterator I;

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while (!feof(stdin))
    {
        n++;
        scanf("%d %s ",&tip[n],cuv[n]);
        len[n] = strlen(cuv[n]);
        p[n] = n;
    }
    sort(p+1,p+n+1,cmp1);
    S.insert(n+1);
    for (i=1; i<=n; i++)
        if (string(cuv[p[i]]) == string(cuv[p[i-1]]))
            q[p[i]] = q[p[i-1]];
        else
            q[p[i]] = i;
    for (i=1; i<=n; i++)
    {
        if (tip[i] == 0)
        {
            S.insert(q[i]);
            nr[q[i]]++;
        }
        if (tip[i] == 1)
        {
            nr[q[i]]--;
            if (nr[q[i]] == 0)
                S.erase(q[i]);
        }
        if (tip[i] == 2)
            printf("%d\n",nr[q[i]]);
        if (tip[i] == 3)
        {
            v1 = v2 = 0;
            I = S.lower_bound(q[i]);
            v1 = cmp2(i,p[*I]);
            if (I != S.begin())
            {
                I--;
                v2 = cmp2(i,p[*I]);
            }
            printf("%d\n",max(v1,v2));
        }
    }
    return 0;
}

int cmp1 (int x, int y)
{
    return string(cuv[x])<string(cuv[y]);
}

int cmp2 (int x, int y)
{
    int i, l = min(len[x],len[y]);
    for (i=0; i<l && cuv[x][i]==cuv[y][i]; i++);
    return i;
}