Pagini recente » Cod sursa (job #579665) | Cod sursa (job #2747901) | Cod sursa (job #2061265) | Cod sursa (job #2865580) | Cod sursa (job #1802303)
#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;
}