#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define REP(i,b) FOR(i,0,b)
const int Nmax = 1000001;
int bucket[Nmax];
template <class T>
void CreateBeginBucket(T* data, int size, int maxVal){
REP(i, maxVal + 1) bucket[i] = 0;
REP(i, size) bucket[data[i]]++;
int sum = 0;
REP(i, maxVal + 1){ bucket[i] += sum; swap(bucket[i], sum); }
}
template <class T>
void CreateEndBucket(T* data, int size, int maxVal){
REP(i, maxVal + 1) bucket[i] = 0;
REP(i, size) bucket[data[i]]++;
int sum = 0;
REP(i, maxVal + 1){ sum += bucket[i]; bucket[i] = sum; }
}
template<class T>
void InducedSort(T* data, int size, int* SA, int maxVal, bool* isL){
CreateBeginBucket(data, size, maxVal);
REP(i, size) if (SA[i] > 0 && isL[SA[i] - 1]) SA[bucket[data[SA[i] - 1]]++] = SA[i] - 1;
}
template<class T>
void InvertInducedSort(T* data, int size, int* SA, int maxVal, bool* isL){
CreateEndBucket(data, size, maxVal);
for (int i = size - 1; i >= 0; --i) if (SA[i] > 0 && !isL[SA[i] - 1]) SA[--bucket[data[SA[i] - 1]]] = SA[i] - 1;
}
template <class T>
void DBGOUT(T* sa, int size){
REP(i, size) printf("%d ", int(sa[i]));
printf("\n");
}
template<class T>
void SA_IS(T* data, int size, int* SA, int maxVal, bool* isL){
REP(i, size) SA[i] = -1;
#define isLMS(x) (x>0 && isL[x-1] && !isL[x])
isL[size - 1] = false;
for (int i = size - 2; i >= 0; i--) isL[i] = data[i] > data[i + 1] || (data[i] == data[i + 1] && isL[i + 1]);
CreateEndBucket(data, size, maxVal);
FOR(i, 1, size) if (isLMS(i)) SA[--bucket[data[i]]] = i;
InducedSort(data, size, SA, maxVal, isL);
InvertInducedSort(data, size, SA, maxVal, isL);
int c = 0;
REP(i, size) if (isLMS(SA[i])) SA[c++] = SA[i];
FOR(i, c, size) SA[i] = -1;
int idx = -1;
int prev = -1;
REP(i, c){
bool diff = false;
REP(d, size){
if (prev == -1 || data[SA[i] + d] != data[prev + d] || isL[SA[i] + d] != isL[prev + d]){
diff = true;
break;
}
else if (d > 0 && isLMS(SA[i] + d)) break;
}
if (diff){ idx++; prev = SA[i]; }
SA[c + SA[i] / 2] = idx;
}
int j = size;
for (int i = size - 1; i >= c; i--) if (SA[i] >= 0) SA[--j] = SA[i];
int* nxdata = SA + size - c;
int* nxsa = SA;
if (c == idx + 1) REP(i, c) nxsa[nxdata[i]] = i;
else SA_IS(nxdata, c, nxsa, idx, isL + size);
j = c;
for (int i = size - 1; i >= 1; i--) if (isLMS(i)) nxdata[--j] = i;
REP(i, c) nxsa[i] = nxdata[nxsa[i]];
FOR(i, c, size) SA[i] = -1;
CreateEndBucket(data, size, maxVal);
for (int i = c - 1; i >= 0; i--) swap(nxsa[i], SA[--bucket[data[nxsa[i]]]]);
InducedSort(data, size, SA, maxVal, isL);
InvertInducedSort(data, size, SA, maxVal, isL);
}
bool isLPool[Nmax * 2];
void SA_IS(unsigned char* input, int size, int* SA){
int mv = 0;
REP(i, size) if (mv < input[i]) mv = input[i];
SA_IS(input, size, SA, mv, isLPool);
}
int lcp[Nmax];
int invertSA[Nmax];
void CreateLCP(unsigned char* data, int size, int* SA){
lcp[0] = -1;
REP(i, size) invertSA[SA[i]] = i;
int prev = 0;
REP(i, size){
if (invertSA[i] > 0){
while (data[i + prev] == data[SA[invertSA[i] - 1] + prev]){
++prev;
if (i + prev >= size || SA[invertSA[i] - 1] + prev >= size)
break;
}
lcp[invertSA[i]] = prev;
}
prev = max(prev - 1, 0);
}
}
int st[21][Nmax];
void InitSparseTable(int n){
int h = 1;
while ((1 << h) < n) h++;
REP(i, n) st[0][i] = lcp[i];
FOR(j, 1, h + 1){
REP(i, n - (1<<j) + 1){
st[j][i] = min(st[j - 1][i], st[j - 1][i + (1 << (j - 1))]);
}
}
}
inline int TopBit(int t){
for (int i = 20; i >= 0; i--){
if ((1 << i)&t) return i;
}
return -1;
}
int GetLCP(int f, int s){
if (f > s) swap(f, s);
int diff = TopBit(s-f);
return min(st[diff][f], st[diff][s - (1 << diff)]);
}
unsigned char str[Nmax];
int indices[Nmax];
int compare(int f, int s, int l){
int fi = invertSA[f];
int si = invertSA[s];
if (GetLCP(fi + 1, si + 1) >= l)
return 0;
else
return 2 * (fi > si) - 1;
}
int dpd[Nmax];
int main(){
int n;
scanf("%d", &n);
scanf("%s", str);
SA_IS(str, n + 1, indices);
CreateLCP(str, n + 1, indices);
InitSparseTable(n + 1);
fill(dpd, dpd + n + 1, 1000000000);
int* dp = dpd + 1;
dp[n - 2] = 1;
int ans = 1000000000;
for (int i = n - 2; i >= 0; i--){
if (str[i + 1] != '0'){
int nx = i - dp[i];
if (nx >= -1){
if (compare(nx + 1, i + 1, dp[i]) <= 0){
nx--;
}
if (nx >= -1){
dp[nx] = min(dp[nx], i - nx);
}
}
}
dp[i - 1] = min(dp[i - 1], dp[i] + 1);
}
printf("%d\n", dp[-1]);
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpPWE7aTxiO2krKykKI2RlZmluZSBSRVAoaSxiKSBGT1IoaSwwLGIpCgpjb25zdCBpbnQgTm1heCA9IDEwMDAwMDE7CmludCBidWNrZXRbTm1heF07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZCBDcmVhdGVCZWdpbkJ1Y2tldChUKiBkYXRhLCBpbnQgc2l6ZSwgaW50IG1heFZhbCl7CglSRVAoaSwgbWF4VmFsICsgMSkgYnVja2V0W2ldID0gMDsKCVJFUChpLCBzaXplKSBidWNrZXRbZGF0YVtpXV0rKzsKCWludCBzdW0gPSAwOwoJUkVQKGksIG1heFZhbCArIDEpeyBidWNrZXRbaV0gKz0gc3VtOyBzd2FwKGJ1Y2tldFtpXSwgc3VtKTsgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZCBDcmVhdGVFbmRCdWNrZXQoVCogZGF0YSwgaW50IHNpemUsIGludCBtYXhWYWwpewoJUkVQKGksIG1heFZhbCArIDEpIGJ1Y2tldFtpXSA9IDA7CglSRVAoaSwgc2l6ZSkgYnVja2V0W2RhdGFbaV1dKys7CglpbnQgc3VtID0gMDsKCVJFUChpLCBtYXhWYWwgKyAxKXsgc3VtICs9IGJ1Y2tldFtpXTsgYnVja2V0W2ldID0gc3VtOyB9Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgSW5kdWNlZFNvcnQoVCogZGF0YSwgaW50IHNpemUsIGludCogU0EsIGludCBtYXhWYWwsIGJvb2wqIGlzTCl7CglDcmVhdGVCZWdpbkJ1Y2tldChkYXRhLCBzaXplLCBtYXhWYWwpOwoJUkVQKGksIHNpemUpIGlmIChTQVtpXSA+IDAgJiYgaXNMW1NBW2ldIC0gMV0pIFNBW2J1Y2tldFtkYXRhW1NBW2ldIC0gMV1dKytdID0gU0FbaV0gLSAxOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgp2b2lkIEludmVydEluZHVjZWRTb3J0KFQqIGRhdGEsIGludCBzaXplLCBpbnQqIFNBLCBpbnQgbWF4VmFsLCBib29sKiBpc0wpewoJQ3JlYXRlRW5kQnVja2V0KGRhdGEsIHNpemUsIG1heFZhbCk7Cglmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSBpZiAoU0FbaV0gPiAwICYmICFpc0xbU0FbaV0gLSAxXSkgU0FbLS1idWNrZXRbZGF0YVtTQVtpXSAtIDFdXV0gPSBTQVtpXSAtIDE7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIERCR09VVChUKiBzYSwgaW50IHNpemUpewoJUkVQKGksIHNpemUpIHByaW50ZigiJWQgIiwgaW50KHNhW2ldKSk7CglwcmludGYoIlxuIik7Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgU0FfSVMoVCogZGF0YSwgaW50IHNpemUsIGludCogU0EsIGludCBtYXhWYWwsIGJvb2wqIGlzTCl7CglSRVAoaSwgc2l6ZSkgU0FbaV0gPSAtMTsKI2RlZmluZSBpc0xNUyh4KSAoeD4wICYmIGlzTFt4LTFdICYmICFpc0xbeF0pCglpc0xbc2l6ZSAtIDFdID0gZmFsc2U7Cglmb3IgKGludCBpID0gc2l6ZSAtIDI7IGkgPj0gMDsgaS0tKSBpc0xbaV0gPSBkYXRhW2ldID4gZGF0YVtpICsgMV0gfHwgKGRhdGFbaV0gPT0gZGF0YVtpICsgMV0gJiYgaXNMW2kgKyAxXSk7CglDcmVhdGVFbmRCdWNrZXQoZGF0YSwgc2l6ZSwgbWF4VmFsKTsKCUZPUihpLCAxLCBzaXplKSBpZiAoaXNMTVMoaSkpIFNBWy0tYnVja2V0W2RhdGFbaV1dXSA9IGk7CglJbmR1Y2VkU29ydChkYXRhLCBzaXplLCBTQSwgbWF4VmFsLCBpc0wpOwoJSW52ZXJ0SW5kdWNlZFNvcnQoZGF0YSwgc2l6ZSwgU0EsIG1heFZhbCwgaXNMKTsKCglpbnQgYyA9IDA7CglSRVAoaSwgc2l6ZSkgaWYgKGlzTE1TKFNBW2ldKSkgU0FbYysrXSA9IFNBW2ldOwoJRk9SKGksIGMsIHNpemUpIFNBW2ldID0gLTE7CgoJaW50IGlkeCA9IC0xOwoJaW50IHByZXYgPSAtMTsKCVJFUChpLCBjKXsKCQlib29sIGRpZmYgPSBmYWxzZTsKCQlSRVAoZCwgc2l6ZSl7CgkJCWlmIChwcmV2ID09IC0xIHx8IGRhdGFbU0FbaV0gKyBkXSAhPSBkYXRhW3ByZXYgKyBkXSB8fCBpc0xbU0FbaV0gKyBkXSAhPSBpc0xbcHJldiArIGRdKXsKCQkJCWRpZmYgPSB0cnVlOwoJCQkJYnJlYWs7CgkJCX0KCQkJZWxzZSBpZiAoZCA+IDAgJiYgaXNMTVMoU0FbaV0gKyBkKSkgYnJlYWs7CgkJfQoJCWlmIChkaWZmKXsgaWR4Kys7IHByZXYgPSBTQVtpXTsgfQoJCVNBW2MgKyBTQVtpXSAvIDJdID0gaWR4OwoJfQoJaW50IGogPSBzaXplOwoJZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IGM7IGktLSkgaWYgKFNBW2ldID49IDApIFNBWy0tal0gPSBTQVtpXTsKCglpbnQqIG54ZGF0YSA9IFNBICsgc2l6ZSAtIGM7CglpbnQqIG54c2EgPSBTQTsKCWlmIChjID09IGlkeCArIDEpIFJFUChpLCBjKSBueHNhW254ZGF0YVtpXV0gPSBpOwoJZWxzZSBTQV9JUyhueGRhdGEsIGMsIG54c2EsIGlkeCwgaXNMICsgc2l6ZSk7CgoJaiA9IGM7Cglmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMTsgaS0tKSBpZiAoaXNMTVMoaSkpIG54ZGF0YVstLWpdID0gaTsKCVJFUChpLCBjKSBueHNhW2ldID0gbnhkYXRhW254c2FbaV1dOwoJRk9SKGksIGMsIHNpemUpIFNBW2ldID0gLTE7CglDcmVhdGVFbmRCdWNrZXQoZGF0YSwgc2l6ZSwgbWF4VmFsKTsKCWZvciAoaW50IGkgPSBjIC0gMTsgaSA+PSAwOyBpLS0pIHN3YXAobnhzYVtpXSwgU0FbLS1idWNrZXRbZGF0YVtueHNhW2ldXV1dKTsKCUluZHVjZWRTb3J0KGRhdGEsIHNpemUsIFNBLCBtYXhWYWwsIGlzTCk7CglJbnZlcnRJbmR1Y2VkU29ydChkYXRhLCBzaXplLCBTQSwgbWF4VmFsLCBpc0wpOwp9Cgpib29sIGlzTFBvb2xbTm1heCAqIDJdOwp2b2lkIFNBX0lTKHVuc2lnbmVkIGNoYXIqIGlucHV0LCBpbnQgc2l6ZSwgaW50KiBTQSl7CglpbnQgbXYgPSAwOwoJUkVQKGksIHNpemUpIGlmIChtdiA8IGlucHV0W2ldKSBtdiA9IGlucHV0W2ldOwoJU0FfSVMoaW5wdXQsIHNpemUsIFNBLCBtdiwgaXNMUG9vbCk7Cn0KCmludCBsY3BbTm1heF07CmludCBpbnZlcnRTQVtObWF4XTsKdm9pZCBDcmVhdGVMQ1AodW5zaWduZWQgY2hhciogZGF0YSwgaW50IHNpemUsIGludCogU0EpewoJbGNwWzBdID0gLTE7CglSRVAoaSwgc2l6ZSkgaW52ZXJ0U0FbU0FbaV1dID0gaTsKCWludCBwcmV2ID0gMDsKCVJFUChpLCBzaXplKXsKCQlpZiAoaW52ZXJ0U0FbaV0gPiAwKXsKCQkJd2hpbGUgKGRhdGFbaSArIHByZXZdID09IGRhdGFbU0FbaW52ZXJ0U0FbaV0gLSAxXSArIHByZXZdKXsKCQkJCSsrcHJldjsKCQkJCWlmIChpICsgcHJldiA+PSBzaXplIHx8IFNBW2ludmVydFNBW2ldIC0gMV0gKyBwcmV2ID49IHNpemUpCgkJCQkJYnJlYWs7CgkJCX0KCQkJbGNwW2ludmVydFNBW2ldXSA9IHByZXY7CgkJfQoJCXByZXYgPSBtYXgocHJldiAtIDEsIDApOwoJfQp9CgppbnQgc3RbMjFdW05tYXhdOwp2b2lkIEluaXRTcGFyc2VUYWJsZShpbnQgbil7CglpbnQgaCA9IDE7Cgl3aGlsZSAoKDEgPDwgaCkgPCBuKSBoKys7CglSRVAoaSwgbikgc3RbMF1baV0gPSBsY3BbaV07CglGT1IoaiwgMSwgaCArIDEpewoJCVJFUChpLCBuIC0gKDE8PGopICsgMSl7CgkJCXN0W2pdW2ldID0gbWluKHN0W2ogLSAxXVtpXSwgc3RbaiAtIDFdW2kgKyAoMSA8PCAoaiAtIDEpKV0pOwoJCX0KCX0KfQoKaW5saW5lIGludCBUb3BCaXQoaW50IHQpewoJZm9yIChpbnQgaSA9IDIwOyBpID49IDA7IGktLSl7CgkJaWYgKCgxIDw8IGkpJnQpIHJldHVybiBpOwoJfQoJcmV0dXJuIC0xOwp9CgppbnQgR2V0TENQKGludCBmLCBpbnQgcyl7CglpZiAoZiA+IHMpIHN3YXAoZiwgcyk7CglpbnQgZGlmZiA9IFRvcEJpdChzLWYpOwoJcmV0dXJuIG1pbihzdFtkaWZmXVtmXSwgc3RbZGlmZl1bcyAtICgxIDw8IGRpZmYpXSk7Cn0KCnVuc2lnbmVkIGNoYXIgc3RyW05tYXhdOwppbnQgaW5kaWNlc1tObWF4XTsKCmludCBjb21wYXJlKGludCBmLCBpbnQgcywgaW50IGwpewoJaW50IGZpID0gaW52ZXJ0U0FbZl07CglpbnQgc2kgPSBpbnZlcnRTQVtzXTsKCWlmIChHZXRMQ1AoZmkgKyAxLCBzaSArIDEpID49IGwpCgkJcmV0dXJuIDA7CgllbHNlCgkJcmV0dXJuIDIgKiAoZmkgPiBzaSkgLSAxOwp9CgppbnQgZHBkW05tYXhdOwppbnQgbWFpbigpewoJaW50IG47CglzY2FuZigiJWQiLCAmbik7CglzY2FuZigiJXMiLCBzdHIpOwoJU0FfSVMoc3RyLCBuICsgMSwgaW5kaWNlcyk7CglDcmVhdGVMQ1Aoc3RyLCBuICsgMSwgaW5kaWNlcyk7CglJbml0U3BhcnNlVGFibGUobiArIDEpOwoJZmlsbChkcGQsIGRwZCArIG4gKyAxLCAxMDAwMDAwMDAwKTsKCWludCogZHAgPSBkcGQgKyAxOwoJZHBbbiAtIDJdID0gMTsKCWludCBhbnMgPSAxMDAwMDAwMDAwOwoJZm9yIChpbnQgaSA9IG4gLSAyOyBpID49IDA7IGktLSl7CgkJaWYgKHN0cltpICsgMV0gIT0gJzAnKXsKCQkJaW50IG54ID0gaSAtIGRwW2ldOwoJCQlpZiAobnggPj0gLTEpewoJCQkJaWYgKGNvbXBhcmUobnggKyAxLCBpICsgMSwgZHBbaV0pIDw9IDApewoJCQkJCW54LS07CgkJCQl9CgkJCQlpZiAobnggPj0gLTEpewoJCQkJCWRwW254XSA9IG1pbihkcFtueF0sIGkgLSBueCk7CgkJCQl9CgkJCX0KCQl9CgkJZHBbaSAtIDFdID0gbWluKGRwW2kgLSAxXSwgZHBbaV0gKyAxKTsKCX0KCXByaW50ZigiJWRcbiIsIGRwWy0xXSk7Cn0K