这是本文档旧的修订版!
给定初始字符串 $S_0$,接下来 $n$ 条递推式。
类型 $1$:$S_i=S_j[l,r]$。
类型 $2$:$S_i=S_jS_k$。
求 $S_n$ 的所有字符的 $\text{Ascii}$ 码之和,保证所有字符串长度不超过 $2^{63}-1$。
首先顺序读入同时维护所有字符串长度。然后设 $\text{dp}(k,l,r)$ 表示 $S_k[l,r]$ 的 $\text{Ascii}$ 码和,记忆化搜索逆推。
关于时间复杂度,定义计算 $S_1,S_2\cdots S_n$ 的所有答案的时间复杂度为 $T(n)$。
假设已经算出了前 $n-1$ 项的答案,然后仅需计算第 $n$ 项。发现逆推过程有些类似线段树的区间询问,遇到询问完整 $S_i$ 的区间直接返回。
于是每层仅 $O(1)$ 个结点,且树的深度为 $O(n)$,于是又递归式 $T(n)=T(n-1)+O(n)$,进一步有 $T(n)=O(n^2)$。
ps. 还可以在从后往前递推询问时将多个相交询问分割成若干不相交小区间,维护每个小区间对应的询问数。然后处理每个小区间对应的询问。
于是每层最多有一个小区间分裂,共 $O(n)$ 层,也可以证明时间复杂度等于结点数等于 $O(n^2)$。