Pagini recente » Cod sursa (job #1779215) | Cod sursa (job #3161747) | Cod sursa (job #2607857) | Cod sursa (job #339687) | Cod sursa (job #317383)
Cod sursa(job #317383)
#include <cstdio>
#include <vector>
#include <cassert>
#define LENMAX 100
using namespace std;
struct trie {
int Fiu[10], Total, Term;
};
trie T[1300000];
trie nil;
char k[100100];
int Nr = 1;
void insert (int nod, char * x, int level, bool luat) {
int lit = *x - '0';
if (*x < '0' || *x > '9') {
if (! T[nod].Term)
T[nod].Total ++;
T[nod].Term = 1;
return;
}
if (! T[nod].Fiu[lit]) {
T[nod].Fiu[lit] = ++ Nr ;
T[Nr] = nil;
}
int next = T[nod].Fiu[lit];
if (lit)
luat = 1;
insert (next, x + 1, level + 1, luat);
T[nod].Total = 0;
for (int i = 0; i <= 9; ++ i)
T[nod].Total += T[T[nod].Fiu[i]].Total;
T[nod].Total = + T[nod].Term;
}
/*
void query (int nod, int k, bool luat) {
int i;
// fprintf(stderr, "I'm in node %d searching for %d-th\n", nod, k);
if (T[nod].Term) {
if (k == 1)
return ;
else
k --;
}
for (i = 0; i <= 9 && T[nod].St[i] < k; ++ i);
while (i >= 0 && T[nod].Fiu[i] == 0)
-- i;
assert (i <= 9);
assert (i >= 0);
int next = k;
if (i > 0)
next -= T[nod].St[i - 1];
if (i || (!i && luat))
printf("%d", i);
if (i)
luat = 1;
query (T[nod].Fiu[i], next, luat);
}
void make (char k[]) {
int x = strlen(k);
if (x < LENMAX + 1) {
int diff = LENMAX - x + 1;
for (int i = LENMAX; i >= 1; -- i)
k[i + diff] = k[i];
for (int i = 1; i <= diff; ++ i)
k[i] = '0';
}
// puts(k);
} */
int main () {
int N, i, tip, x;
freopen("nums.in", "r", stdin);
freopen("nums.out", "w", stdout);
scanf("%d", &N);
T[0] = T[1] = nil;
for (i = 1; i <= N; ++ i) {
scanf("%d", &tip);
if (tip == 1) {
gets(k);
// make(k);
insert (1, k + 1, 0, false);
}
else {
scanf("%d", &x);
// query (1, x, false);
printf("\n");
}
}
/* for (int j = 1; j <= Nr; ++ j) {
printf("***************************\n");
printf("NOD : %d\n", j);
printf("%d\n", T[j].Total);
printf("%d\n", T[j].Term);
for (i = 0; i < 10; ++ i)
printf("%d ", T[j].St[i]);
puts("");
for (i = 0; i < 10; ++ i)
printf("%d ", T[j].Fiu[i]);
puts("");
for (i = 0; i < 10; ++ i)
printf("%d ", T[j].V[i]);
puts("");
}*/
}