- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
// https://github.com/vk-com/kphp-kdb/blob/ce6dead5b3345f4b38487cc9e45d55ced3dd7139/bayes/bayes-data.c#L569
for (i = j = 0; v[i]; i++) {
f[j] = i;
if (v[i + 1] == '#' && (v[i] == '&' || v[i] == '$')) {
int r = 0, ti = i;
if (v[i + 2] != 'x') {
for (i += 2; v[i] != ';' && v[i]; i++) {
if ('0' <= v[i] && v[i] <= '9') {
r = r * 10 + v[i] - '0';
} else {
break;
}
}
} else {
for (i += 3; v[i] != ';' && v[i]; i++) {
if (('0' <= v[i] && v[i] <= '9') ||
('a' <= v[i] && v[i] <= 'f') ||
('A' <= v[i] && v[i] <= 'F')) {
r = r * 16;
if (v[i] <= '9') {
r += v[i] - '0';
} else if (v[i] <= 'F') {
r += v[i] - 'A' + 10;
} else {
r += v[i] - 'a' + 10;
}
} else {
break;
}
}
}
if (r == 0) {
bad[j] = 0;
pv[j++] = v[i = ti];
} else {
bad[j] = 1;
pv[j++] = r;
if (v[i] != ';') {
i--;
}
}
} else if (v[i] == '%' && '0' <= v[i + 1] && v[i + 1] <= '7' &&
(('0' <= v[i + 2] && v[i + 2] <= '9') ||
('a' <= v[i + 2] && v[i + 2] <= 'f') ||
('A' <= v[i + 2] && v[i + 2] <= 'F'))) {
int r = (v[i + 1] - '0') * 16;
if (v[i + 2] <= '9') {
r += v[i + 2] - '0';
} else if (v[i + 2] <= 'F') {
r += v[i + 2] - 'A' + 10;
} else {
r += v[i + 2] - 'a' + 10;
}
i += 2;
if (r != ':' && r != '/' && r != '=' && r != '?' && r != '&' && r != '+') {
bad[j] = 1;
} else {
bad[j] = 0;
}
pv[j++] = r;
} else {
bad[j] = 0;
pv[j++] = v[i];
}
}
f[j] = i;
pv[j] = 0;
for (i = 0; i < j; i++) {
if ('A' <= pv[i] && pv[i] <= 'Z') {
pv[i] = pv[i] - 'A' + 'a';
bad[i] += 2;
}
}
j123123 22.09.2017 04:09 # 0
Как думаете, сраные вконтактовские долбоебы-олимпиадники, писавшие эту хуйню, слышали например про алгоритм Ахо-Корасик или Бойера-Мура?
roman-kashitsyn 22.09.2017 11:57 # 0
Я думаю, что они слышали. А ты слышал?
Бойер-Мур и Ахо-Корасик строят автоматы для поиска одного или нескольких (в случае А-К) шаблонов в строке. Т.е. по сути это реализация find(needle(s), haystack). Как это поможет тебе для парсинга урла в один проход?
j123123 22.09.2017 12:13 # 0
После заматчивания подобной хрени, можно в "?" проверить, было ли там "http://" или "https://" или вообще некая иная хрень, и дальше или пытаться это парсить дальше как урл, или искать в другом месте начало урла
roman-kashitsyn 22.09.2017 14:47 # +1
Т.е. ты предлагаешь строить по отдельному автомату только для того, чтобы заматчить каждый компонент урла?
Типа это будет быстрее/лучше, чем последовательность рукописных автоматов на сишке?
Или нужно снова автоматы из сишных комментариев генерить? Или семантику описывать на Coq с кодогенератором?
Код может и не идеальный, но идеологически против такого подхода я против ничего не имею. Кмк, оптимальный трейдофф в плане speed/running time/development time. Это скорее ты упоротый, а не вк-олимпиадники.
j123123 22.09.2017 15:23 # 0
Нет, не оптимальный. Этот код кстати довольно легко можно затормозить, подсунув какие-нибудь специальные входные говноданные, типа
т.е. если подобный говнокод выполняется где-то на бэкенде и кто-то без капчи и регистрации может туда отправлять текстовые данные, которые через такое говно прокручиваются, можно запросто заDDoSить, отправляя кучу таких дебильных строк
j123123 22.09.2017 15:32 # 0
j123123 22.09.2017 13:18 # 0
j123123 22.09.2017 13:31 # 0
Antervis 22.09.2017 14:27 # 0
j123123 22.09.2017 14:31 # 0
по-твоему это будет быстрее?
Antervis 22.09.2017 14:44 # 0
j123123 22.09.2017 14:53 # 0
чтобы затормозить парсер. Да и тут такой подход будет избыточен. Например
в общем даже тупую проверку на совпадение "http" куска можно заоптимизировать
Antervis 22.09.2017 15:04 # 0
g0_1494089704500 26.03.2018 13:43 # 0
inho 24.09.2017 00:08 # +2
j123123 24.09.2017 00:28 # +2
Насчет "достаточно оптимально" - вранье. Этот код ОЧЕНЬ НЕОПТИМАЛЬНЫЙ. Про более оптимальные методы - читай мои же комментарии к этому говнокоду
inho 26.03.2018 23:59 # 0
SemaReal 27.03.2018 00:11 # 0
и вместо
pv[i] == 'h' && pv[i + 1] == 't' && pv[i + 2] == 't' && pv[i + 3] == 'p'
сделать
..то vk сразу же начнет тормозить, ляжет под нагрузкой и программиста выгонят?
bormand 24.09.2017 09:30 # +1
SemaReal 26.03.2018 23:52 # 0