【NOIP模拟】 20/02/13

【NOIP模拟】 20/02/13

  • 线段树维护区间 g,c,d,gc,cd,gcdg,c,d,gc,cd,gcd 个数即可
    nlog(n)nlog(n) 为啥 nn 只有 8000080000 而且还开 3s3s ,而且中间不用取模用 unsigned intunsigned\ int,所以至少 1e61e6 吧(雾),CodeCode

【NOIP模拟】 20/02/13


【NOIP模拟】 20/02/13

  • 蛮有意思的,考场肝了 3.5h3.5h 还好写出来了
    我们考虑枚举回文串的中间点,一定是在一个串中,且在这个串中,一个端点要和它形成一个回文串
    把原本就是回文串的特判掉(Infinity),那么我们钦定这个中间点后就有一个前缀或是后缀需要我们用其它串匹配,假如现在需要找一个串匹配我们的后缀,nn 很小,我们暴力枚举每一个串与之匹配

  • 那么我们可以分类讨论:

  1. 当前串的后缀包涵把后缀反过来的串,那么这种情况可以转换为我们需要匹配一个前缀
  2. 当前串被后缀反过来的串完全包涵,那么这种情况可以转换为匹配一个更短的后缀
  3. 当前串与后缀反过来相同,那么这种情况可以拼成一个回文串(Infinity)
  4. 当前串的后缀与后缀反过来的前缀相同,这种情况把自己封死不能继续匹配,但有一个相同部分长度的贡献
  • 暴力搜索显然不行,然后发现不管前面怎么匹配的,当前需要匹配的后缀一定,到末尾的最大长度是一定的,于是可以 dpdpdp[i][j][0/1]dp[i][j][0/1] 表示需要匹配第 ii 个串第 jj 个位置的前缀或是后缀,到匹配完毕的最大长度,那么这样的复杂度是 n2Ln^2L

  • 脑子有些糊涂写了 hashhash,但发现居然要求类似 lcplcp 的东西,那不是白给自己套一个 loglog 吗,于是改成后缀数组,把所有串正反拼起来做一遍就可以了,这里的复杂度是 Llog(L)\sum L*log(\sum L)
    然后找到合法的中间点(它所在的回文串顶到端点)可以用 manacharmanachar 预处理,顺便把在一个串中的回文串的答案求了

  • 十分好写,只有 150 排 CodeCode