zoukankan      html  css  js  c++  java
  • CF1110H

    题意

    (a[i...j])为字符串(a)单独拉([i,j])组成的数字
    给定(l,r,n),求一个(n)位数,可能有前导(0),求(sumlimits_{1le ile jle n}a[i...j]in[l,r])。((1le lle rle 100^{800},nle 2000)

    做法

    考虑一个暴力:
    ([l,r])拉出来建AC自动机,令(f_{i,u})为到达(u)点,此时长度已为(i),合法字段的最大个数,(f_{i,u}+dep_{v}longrightarrow f_{i+1,v})
    其中(dep_v)(v)在fail树上的深度

    令这个自动机为原自动机

    考虑减少AC自动机上的节点数,有许多位置之后不受限制了。比如(l=12345,r=30000),当做到(x=13???),后面三个问号是可以随意选择的。
    然后将这些节点放到AC自动机上(这里强烈建议看代码,说不太清...)

    然后令(g_{u,l})表示到达(u)点时,后面填任意长度为(l)的数字,都在原自动机上合法。初始化可以在建自动机的时候搞出来。
    然后再通过累加fail树祖先的,得以完善

    (f_{i,u}+sumlimits_{j=0}^{n-(i+1)}g_{v,j}longrightarrow f_{i+1,v})

    题外话

    这题本身并不难,但思路偏了几次,浪费的时间就很长

  • 相关阅读:
    L2-1 功夫传人 (25分)
    7-11 家庭房产(25 分)
    7-11 玩转二叉树 (25分)
    7-10 排座位 (25分)
    7-12 最长对称子串 (25分)
    7-10 树的遍历 (25分)
    STL
    Max Gcd
    水果
    Rails
  • 原文地址:https://www.cnblogs.com/Grice/p/12913761.html
Copyright © 2011-2022 走看看