#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
static const int MultiplyDeBruijnBitPosition[32] = {
0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};
static const uint32_t PowersOf10[] = {
1, 10, 100, 1000, 10000, 100000,
1000000, 10000000, 100000000, 1000000000
};
static const uint32_t MaxWithDigits[] = {
0, 9, 99, 999, 9999, 99999,
999999, 9999999, 99999999, 999999999
};
static const uint32_t MinWithDigits[] = {
0, 0, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000
};
typedef struct _stringlist {
char *v;
struct _stringlist *next;
} stringlist;
inline int IntegerLogBase2(uint32_t v) {
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
return MultiplyDeBruijnBitPosition[(uint32_t) (v * 0x07C4ACDDU) >> 27];
}
inline int IntegerLogBase10(uint32_t v) {
int t;
t = (IntegerLogBase2(v) + 1) * 1233 >> 12;
return t - (v < PowersOf10[t]);
}
inline int IntegerDigitsBase10(uint32_t v) {
return (v == 0) ? 1 : IntegerLogBase10(v) + 1;
}
inline int Itoa(uint32_t v, char *b) {
int i, l;
i = l = IntegerDigitsBase10(v);
b[i] = 0;
do {
i--;
b[i] = v % 10 + '0';
v /= 10;
} while (i != 0);
return l;
}
inline int range_digits(uint32_t start, uint32_t end) {
int s = IntegerDigitsBase10(start);
int e = IntegerDigitsBase10(end);
int count = 0;
if (s == e) {
count += (end - start + 1) * s;
} else {
count += (MaxWithDigits[s] - start + 1) * s;
count += (end - MinWithDigits[e] + 1) * e;
s++;
while (s != e) {
count += (MaxWithDigits[s] - MinWithDigits[s] + 1) * s;
s++;
}
}
return count;
}
stringlist *range_to_stringlist(uint32_t start, uint32_t end) {
size_t count = end - start + 1;
stringlist
*all
= malloc(sizeof(stringlist
) * count
); char *chrbuf
= malloc(range_digits
(start
, end
) + count
); uint32_t i;
for (i = 0; start + i <= end; i++) {
all[i].v = chrbuf;
all[i].next = all + i + 1;
chrbuf += Itoa(start + i, chrbuf) + 1;
}
all[i - 1].next = 0;
return all;
}
size_t stringlist_strlen(stringlist *s) {
size_t l = 0;
while (s != NULL) {
s = s->next;
}
return l;
}
void stringlist_to_str(stringlist *s, char *b) {
size_t l;
while (s != NULL) {
b += l;
s = s->next;
}
*b = 0;
}
int main() {
stringlist *s;
s = range_to_stringlist(0, 4999999);
char *c
= malloc(stringlist_strlen
(s
) + 1); stringlist_to_str(s, c);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CgpzdGF0aWMgY29uc3QgaW50IE11bHRpcGx5RGVCcnVpam5CaXRQb3NpdGlvblszMl0gPSB7CiAgICAwLCA5LCAxLCAxMCwgMTMsIDIxLCAyLCAyOSwgMTEsIDE0LCAxNiwgMTgsIDIyLCAyNSwgMywgMzAsCiAgICA4LCAxMiwgMjAsIDI4LCAxNSwgMTcsIDI0LCA3LCAxOSwgMjcsIDIzLCA2LCAyNiwgNSwgNCwgMzEKfTsKCnN0YXRpYyBjb25zdCB1aW50MzJfdCBQb3dlcnNPZjEwW10gPSB7CiAgICAxLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLAogICAgMTAwMDAwMCwgMTAwMDAwMDAsIDEwMDAwMDAwMCwgMTAwMDAwMDAwMAp9OwoKc3RhdGljIGNvbnN0IHVpbnQzMl90IE1heFdpdGhEaWdpdHNbXSA9IHsKICAgIDAsIDksIDk5LCA5OTksIDk5OTksIDk5OTk5LAogICAgOTk5OTk5LCA5OTk5OTk5LCA5OTk5OTk5OSwgOTk5OTk5OTk5Cn07CgpzdGF0aWMgY29uc3QgdWludDMyX3QgTWluV2l0aERpZ2l0c1tdID0gewogICAgMCwgMCwgMTAsIDEwMCwgMTAwMCwgMTAwMDAsCiAgICAxMDAwMDAsIDEwMDAwMDAsIDEwMDAwMDAwLCAxMDAwMDAwMDAKfTsKCnR5cGVkZWYgc3RydWN0IF9zdHJpbmdsaXN0IHsKICAgIGNoYXIgKnY7CiAgICBzdHJ1Y3QgX3N0cmluZ2xpc3QgKm5leHQ7Cn0gc3RyaW5nbGlzdDsKCmlubGluZSBpbnQgSW50ZWdlckxvZ0Jhc2UyKHVpbnQzMl90IHYpIHsKICAgIHYgfD0gdiA+PiAxOwogICAgdiB8PSB2ID4+IDI7CiAgICB2IHw9IHYgPj4gNDsKICAgIHYgfD0gdiA+PiA4OwogICAgdiB8PSB2ID4+IDE2OwogICAgcmV0dXJuIE11bHRpcGx5RGVCcnVpam5CaXRQb3NpdGlvblsodWludDMyX3QpICh2ICogMHgwN0M0QUNERFUpID4+IDI3XTsKfQoKaW5saW5lIGludCBJbnRlZ2VyTG9nQmFzZTEwKHVpbnQzMl90IHYpIHsKICAgIGludCB0OwogICAgdCA9IChJbnRlZ2VyTG9nQmFzZTIodikgKyAxKSAqIDEyMzMgPj4gMTI7CiAgICByZXR1cm4gdCAtICh2IDwgUG93ZXJzT2YxMFt0XSk7Cn0KCmlubGluZSBpbnQgSW50ZWdlckRpZ2l0c0Jhc2UxMCh1aW50MzJfdCB2KSB7CiAgICByZXR1cm4gKHYgPT0gMCkgPyAxIDogSW50ZWdlckxvZ0Jhc2UxMCh2KSArIDE7Cn0KCmlubGluZSBpbnQgSXRvYSh1aW50MzJfdCB2LCBjaGFyICpiKSB7CiAgICBpbnQgaSwgbDsKICAgIGkgPSBsID0gSW50ZWdlckRpZ2l0c0Jhc2UxMCh2KTsKICAgIGJbaV0gPSAwOwogICAgZG8gewogICAgICAgIGktLTsKICAgICAgICBiW2ldID0gdiAlIDEwICsgJzAnOwogICAgICAgIHYgLz0gMTA7CiAgICB9IHdoaWxlIChpICE9IDApOwogICAgcmV0dXJuIGw7Cn0KCmlubGluZSBpbnQgcmFuZ2VfZGlnaXRzKHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpIHsKICAgIGludCBzID0gSW50ZWdlckRpZ2l0c0Jhc2UxMChzdGFydCk7CiAgICBpbnQgZSA9IEludGVnZXJEaWdpdHNCYXNlMTAoZW5kKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBpZiAocyA9PSBlKSB7CiAgICAgICAgY291bnQgKz0gKGVuZCAtIHN0YXJ0ICsgMSkgKiBzOwogICAgfSBlbHNlIHsKICAgICAgICBjb3VudCArPSAoTWF4V2l0aERpZ2l0c1tzXSAtIHN0YXJ0ICsgMSkgKiBzOwogICAgICAgIGNvdW50ICs9IChlbmQgLSBNaW5XaXRoRGlnaXRzW2VdICsgMSkgKiBlOwogICAgICAgIHMrKzsKICAgICAgICB3aGlsZSAocyAhPSBlKSB7CiAgICAgICAgICAgIGNvdW50ICs9IChNYXhXaXRoRGlnaXRzW3NdIC0gTWluV2l0aERpZ2l0c1tzXSArIDEpICogczsKICAgICAgICAgICAgcysrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKc3RyaW5nbGlzdCAqcmFuZ2VfdG9fc3RyaW5nbGlzdCh1aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kKSB7CiAgICBzaXplX3QgY291bnQgPSBlbmQgLSBzdGFydCArIDE7CiAgICBzdHJpbmdsaXN0ICphbGwgPSBtYWxsb2Moc2l6ZW9mKHN0cmluZ2xpc3QpICogY291bnQpOwogICAgY2hhciAqY2hyYnVmID0gbWFsbG9jKHJhbmdlX2RpZ2l0cyhzdGFydCwgZW5kKSArIGNvdW50KTsKICAgIHVpbnQzMl90IGk7CiAgICBmb3IgKGkgPSAwOyBzdGFydCArIGkgPD0gZW5kOyBpKyspIHsKICAgICAgICBhbGxbaV0udiA9IGNocmJ1ZjsKICAgICAgICBhbGxbaV0ubmV4dCA9IGFsbCArIGkgKyAxOwogICAgICAgIGNocmJ1ZiArPSBJdG9hKHN0YXJ0ICsgaSwgY2hyYnVmKSArIDE7CiAgICB9CiAgICBhbGxbaSAtIDFdLm5leHQgPSAwOwogICAgcmV0dXJuIGFsbDsKfQoKc2l6ZV90IHN0cmluZ2xpc3Rfc3RybGVuKHN0cmluZ2xpc3QgKnMpIHsKICAgIHNpemVfdCBsID0gMDsKICAgIHdoaWxlIChzICE9IE5VTEwpIHsKICAgICAgICBsICs9IHN0cmxlbihzLT52KTsKICAgICAgICBzID0gcy0+bmV4dDsKICAgIH0KICAgIHJldHVybiBsOwp9Cgp2b2lkIHN0cmluZ2xpc3RfdG9fc3RyKHN0cmluZ2xpc3QgKnMsIGNoYXIgKmIpIHsKCXNpemVfdCBsOwogICAgd2hpbGUgKHMgIT0gTlVMTCkgewogICAgCWwgPSBzdHJsZW4ocy0+dik7CiAgICAgICAgbWVtY3B5KGIsIHMtPnYsIGwpOwogICAgICAgIGIgKz0gbDsKICAgICAgICBzID0gcy0+bmV4dDsKICAgIH0KICAgICpiID0gMDsKfQoKaW50IG1haW4oKSB7CiAgICBzdHJpbmdsaXN0ICpzOwogICAgcyA9IHJhbmdlX3RvX3N0cmluZ2xpc3QoMCwgNDk5OTk5OSk7CiAgICBjaGFyICpjID0gbWFsbG9jKHN0cmluZ2xpc3Rfc3RybGVuKHMpICsgMSk7CiAgICBzdHJpbmdsaXN0X3RvX3N0cihzLCBjKTsKICAgIHByaW50ZigiJWQiLCBzdHJsZW4oYykpOwogICAgcmV0dXJuIDA7Cn0K