[NOIP2020] 字符串匹配(数学解决字符串问题)
预处理出前缀
发现有很多重复步骤,并且计算式形如枚举约数,那就可以考虑筛法。
下文的
定义
定义
复杂度为
核心代码如下
void init()
{
memset(cnt, 0, sizeof(cnt)); f[0] = 0;
rep(i, 1, n) f[i] = f[i - 1] + work(s[i] - 'a');
memset(cnt, 0, sizeof(cnt)); g[n + 1] = 0;
dwn(i, n, 1) g[i] = g[i + 1] + work(s[i] - 'a');
rep(t, 0, 26) rep(i, 1, n)
h[t][i] = h[t][i - 1] + (f[i] <= t);
memset(t, 0, sizeof(t));
rep(j, 1, n) for (int i = j; i <= n; i += j)
if (j % cyc[i] == 0) t[i] += h[g[i + 1]][j - 1];
}