字符串乱做

P10716

qq 次询问 (i,k)(i,k),计数合法的非空字符串 AA 使得存在可空字符串 B1,,Bk1B_1,\dotsb,B_{k-1} 满足 S[1,i]=AB1AABk1AS[1,i]=AB_1A\dotsb AB_{k-1}A

合法的 AA 是前缀且在失配树上是 ii 的祖先,答案为最大的合法前缀 S[1,u]S[1,u] 在失配树上的 depudep_u

枚举 uu,向后找不重叠的出现位置,即后缀和整个串 lcp u\ge u,即第一个 z 函数 u\ge u 的位置。枚举完 uu 之后就删去 zp=uz_p=u 的位置,并查集维护下一个位置。复杂度 O(nlogn)O(n\log n)

P11150

给定长为 nnSSqq 次询问 TT,最小化 S[1,i]+T+S[i+1,n]S[1,i]+T+S[i+1,n],再最小化 ii

先在 ss 末尾加入极大字符。要找到 (i,j)(i,j) 使得 s[1,i]+t[1,j1]=s[1,i+j1]s[1,i]+t[1,j-1]=s[1,i+j-1]tj<si+jt_j<s_{i+j}。最小化第一个不同的位置 i+ji+j,再最小化 ttjj 开始的后缀加上 ssi+1i+1 开始的后缀,再最小化 ss 中的位置 ii

先枚举 jj,枚举 si+j=cs_{i+j}=ctj<ct_j<c,可以用 SAM 做子串定位找到最小的 ii 使得 s[i+1,i+j]=t[1,j1]+cs[i+1,i+j]=t[1,j-1]+c。然后对于相等的 i+ji+j,预处理 tt 的后缀排序即可比较 tt 的两个后缀的字典序大小。

要比较i1+j1=i2+j2i1+j1=i2+j2(i1,j1)(i1,j1)(i2,j2)(i2,j2) ,有 j2>j1j2>j1。如果 j2j2 开始的后缀不是 j1j1 开始的后缀的前缀,就直接比较 rkj1rk_{j1}rkj2rk_{j2}。否则比较 t[j1+mj2+1,m]t[j1+m-j2+1,m]s[i2+1,i1]s[i2+1,i1],因为之前匹配,所以 s[i2+1,i1]s[i2+1,i1]tt 的前缀。如果从 j1+mj2+1j1+m-j2+1 开始的后缀不是从 11 开始的后缀的前缀,那比较 rkj1+mj2+1rk_{j1+m-j2+1}rk1rk_1;否则两个串完全相等。

此时已经找到了最小的串,但是 ii 选取的位置可以往前。找到 tt 的最小循环节 ll,二分将 ii 向前挪 l×midl\times mid,且 s[il×mid+1,imid]=s[il×(mid1)+1,i]s[i-l\times mid+1,i-mid]=s[i-l\times (mid-1)+1,i]

Q9406

给定 nn 个字符串,计数无序 (x,y,z)(x,y,z) 满足 x>yzx>yzx>zyx>zy 且。 y>xzy>xzy>zxy>zxz>xyz>xyz>yxz>yx

判掉含相等的若干情况。

不妨设 x>y,zx>y,z,且 y+zz+yy+z\ge z+y。即 yyxx 的前缀,rkxy<rkz<rkxrk_{x-y}<rk_z<rk_x

uvvuuv\le vu 给每个串排序,即分成三段分类讨论每段的 lcp,将所有串加上终止的极小字符求后缀数组。预处理出所有 (x,y)(x,y),按排序后的顺序枚举 yy,区间查询。