#include<bits/stdc++.h> usingnamespace std; #ifdef LOCAL #define debug(...) fprintf(stdout, ##__VA_ARGS__) #else #define debug(...) void(0) #endif #define int long long inlineintread(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back #define fi first #define se second //#define M #define mo 998244353 #define N 200010 int n, m, i, j, k, T; int rk[N], nrk[N], pw[N]; int g[N], f[N], p[N], Pw[N]; int ans, cnt[N]; vector<int>tong[10]; char s[N];
structBinary_tree { int cnt[N], i; voidclear(int n){ for(i = 0; i <= n; ++i) cnt[i] = 0; } voidadd(int x, int k){ while(x <= n) { cnt[x] = max(cnt[x], k); x += x & -x; } } intqry(int x){ int ans = 0; while(x) { ans = max(ans, cnt[x]); x -= x & -x; } return ans; } }Bin;
intMod(int x){ return (x % mo + mo) % mo; }
signedmain() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif // srand(time(NULL)); // for(i = Pw[0] = 1; i < N; ++i) Pw[i] = Pw[i - 1] * i % mo; T = read(); while(T--) { scanf("%s", s + 1); n = strlen(s + 1); m = sqrt(2 * n) + 5; for(i = 1; i <= n; ++i) { s[i] -= '0'; // a[i] = (a[i - 1] * 11 + s[i]) % mo; p[i] = 1; } for(i = 1; i <= n; ++i) f[i] = g[i] = 0; for(i = 1; i <= n; ++i) p[i] = n - i + 1, rk[i] = 1; // for(i = 1; i <= n; ++i) rk[i] = a[i]; for(int l = 1; l <= m; ++l) { for(i = 1, ans = 0; i <= n; ++i) { if(i >= l ) ans = max(ans, f[i - l + 1]); if(s[i] != 0 && i + l - 1 <= n) g[i] = max(f[i], ans + 1); else g[i] = f[i]; } for(i = 0; i <= n; ++i) cnt[i] = 0; for(i = 0; i <= 9; ++i) tong[i].clear(); for(i = 1; i <= n; ++i) { cnt[rk[p[i]]]++; tong[s[p[i] + l - 1]].pb(p[i]); } for(i = 1; i <= n; ++i) cnt[i] += cnt[i - 1]; // for(i = 1; i <= n; ++i) debug("%lld ", cnt[i]); debug("\n"); for(i = 0; i <= 9; ++i) { for(auto v: tong[i]) { // debug("(%lld) %lld | %lld %d\n", i, v, cnt[rk[v] - 1], (int)s[v + l - 1]); p[++cnt[rk[v] - 1]] = v; } } // for(i = 1; i <= n; ++i) { // debug("[%2d] ", p[i]); // for(j = 1; j <= l; ++j) debug("%d", s[p[i] + j - 1]); //// debug("\n"); // debug("(%lld %lld)\n", rk[p[i]], s[p[i] + l - 1]); // } for(i = 1, j = 0; i <= n; ++i) { if(rk[p[i]] != rk[p[i - 1]] || s[p[i] + l - 1] != s[p[i - 1] + l - 1]) ++j; nrk[p[i]] = j; } for(i = 1; i <= n; ++i) rk[i] = nrk[i]; Bin.clear(n); for(i = 1; i <= n; ++i) { j = p[i]; if(j >= l && j + l - 1 <= n) { g[j] = max(g[j], Bin.qry(j - l) + 1); } Bin.add(j, g[j]); } for(i = 1; i <= n; ++i) f[i] = g[i]; ans = 0; for(i = 1; i <= n; ++i) ans = max(ans, f[i]); // for(i = 1; i <= n; ++i) debug("%lld ", f[i]); // debug("%lld\n", ans); // debug("------------\n"); } ans = 0; for(i = 1; i <= n; ++i) ans = max(ans, f[i]); printf("%lld\n", ans); }