zoukankan      html  css  js  c++  java
  • cojs 疯狂的字符串 题解报告

    首先这道题是GT考试的加强版本QAQ

    当n<k的时候,答案显然是10^n

    当n=k的时候,答案显然是10^n-1

    这样就有20分辣

    之后我们考虑k<=20的做法

    显然设f(i,j)表示前i位匹配到了第j位

    之后用KMP来转移就可以了

    如果不用矩阵乘法优化的话时间复杂度O(n*k*10)

    如果用矩阵乘法的话时间复杂度O(k^3logn)

    其实就是GT考试的做法辣

    这样就有50分了

    之后我们考虑用dp来容斥

    设fi表示前i位且第一次匹配的位置是[i-k+1,i]的方案

    不难发现fi=m^(i-k)-sigma(fj*m^(i-k-j))-sigma(fj)

    其中第一个fj保证j<=i-k

    第二个fj保证[i-k+1,j]这段前缀是数字串的一个后缀

    这个判定可以用哈希或者KMP解决

    这其实是一个卷积形式

    我们机智的构造一个多项式g来转移

    之后就可以做CDQ+FFT辣

    时间复杂度O(nlog^2n)

    可以得到100分了

    实际上我们移项之后可以得到

    m^(i-k)=sigma(fj*gi-j)

    构造多项式h

    得到h=f*g,则f=h*g^(-1)

    多项式求逆即可

  • 相关阅读:
    编译原理 实例
    lex yacc flex bison
    图解tensorflow 源码分析
    PostgreSQL 179个场景 案例集锦
    github view source
    Java 微服务实践
    Linux kernel AIO
    Lex与Yacc学习
    OpenResty 通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台
    nginx Architecture
  • 原文地址:https://www.cnblogs.com/joyouth/p/5598332.html
Copyright © 2011-2022 走看看