/
getRank.c
60 lines (56 loc) · 1.12 KB
/
getRank.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "getRank.h"
int **getRank(char *L)
{
int length = strlen(L);
int **p = (int **)malloc(sizeof(int *)*NUM);
for (int i = 0; i < NUM; i++)
{
p[i] = NULL;
}
int count[NUM] = {0};
int letters[NUM] = {0}, idxletter = 0;
for (int i = 0; i < length; i++)
{
int idx = L[i];
if (p[idx] == NULL)
{
letters[idxletter++] = idx;
p[idx] = (int *)malloc(sizeof(int)*((length>>GAP)+1));
}
}
for (int i = 0; i < length; i++)
{
int idx = L[i];
count[idx]++;
if ((i & 15) == 0)
{
for (int j = 0; j < idxletter; j++)
{
p[letters[j]][i>>GAP] = count[letters[j]];
}
}
}
return p;
}
int rank(int **ranks, char *L, char c, int offset)
{
if (offset < 0)
{
return 0;
}
int numc = 0;
while (offset & 15)
{
if (L[offset] == c)
{
numc++;
}
offset--;
}
int idx = c;
if (ranks[idx] == NULL)
{
return 0;
}
return ranks[idx][offset>>GAP] + numc;
}