#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<string> #define ms(i, j) memset(i, j, sizeof i) #define LL long long #define db double #define fir first #define sec second #define mp make_pair usingnamespace std;
namespace flyinthesky {
constint MAXN = 100000 + 1; structqry { int l, r, id; booloperator < (const qry &rhs) const { return r == rhs.r ? l < rhs.l : r < rhs.r; } } xw[MAXN]; int n, Q, sz, ch[MAXN * 40][2], maxd[MAXN * 40], lst[MAXN * 40], pos[MAXN][55]; // maxd_i i \in [0,40]:存在 LCP 长度为 i 的最大位置 // lst_i: 访问该节点的最后子串(用于求maxd) // pos:如上述 char s[MAXN]; LL ans[MAXN];
voidinsert(int l, int r){ int now = 0, p = 1; for (int i = l; i <= r; ++i, ++p) { int c = s[i] - '0'; if (!ch[now][c]) ch[now][c] = ++sz; now = ch[now][c]; maxd[p] = max(maxd[p], lst[now]); // 更新 lst[now] = l; // 更新当前节点的信息 } }