zoukankan      html  css  js  c++  java
  • Codeforces 932G Palindrome Partition

    题意

    给你一个长为(n)的字符串(S),现在你要把他划分成(k)段,记为(p_1p_2…p_k),其中对于任意(1<=i<=k),满足(p_i=p_k−i−1),且(k)为偶数。问划分方案数。
    n<=1e6

    做法

    (S=s_1s_2s_3...s_{n-2}s_{n-1}s_n),转化成(S'=s_1s_ns_2s_{n-1}s_3s_{n-2}...),这样问题就变成了划分偶回文串
    利用PAM可以做到(O(n^2))

    PAM中的节点的等差数列个数是(O(logn))
    然后每个节点维护其到上面一段等差数列

    考虑(i),当前有最大的几个回文后缀(s_{i-a,i},s_{i-b,i},s_{i-c,i}(a-b=b-c=d)),也就是(f_{i-a-1},f_{i-b-1},f_{i-c-1})会产生贡献
    手玩一下能发现(f_{i-a-1},f_{i-b-1})会对(f_{i-d})产生贡献,也就是之前已经被维护过了,就只用格外把(f_{i-c-1})维护进来即可
    那么(s_{i-a,i-d})

    题外话

    还菜啊...远古题都做不动...

  • 相关阅读:
    C语言II博客作业02
    C语言II博客作业01
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
    C语言||博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
  • 原文地址:https://www.cnblogs.com/Grice/p/12815447.html
Copyright © 2011-2022 走看看