zoukankan      html  css  js  c++  java
  • CF1142D

    题意

    (1,2,3,4,5,6,7,8,9)为好的;若(xge 10)(令(y=x/10)),其是好的,当且仅当(y)是好的,且(x\%10<rk_{y}\%11)
    (rk_y)(y)在所有的好数中的大小排名
    给定字符串(S),求(S)的所有子串有多少个是好的。
    (|S|le 10^5)

    做法

    观察1:一个数是好的,则所有前缀均为好的

    则我们仅需求得以(l)为左端点的极长串

    (f_{i,d})为以(i)为左端点,若左边加上(d),右端点极为(i+f_{i,d}-1),即(d,s_i,s_{i+1},...,s_{i+f_{i,d}-1})为极长好串
    可是我们会发现这样转移不了,因为必是靠(f_{i+1})转移而来,而描述数字(d)甚是不便

    定义1:对于好数(x,y),若(frac{y}{10}=x),则称(y)是由(x)扩展出来的,即(x)右侧添加一个数得到(y)
    观察2:一个好数(x),能扩展出多少数,只关乎于(rk_x\%11),且(x)能扩展出(rk_x\%11\%10)

    这个建议手玩一下

    结论1:令(rk_x)表示(rk_x\%11),则(rk_x=(frac{rk_{frac{x}{10}}(rk_{frac{x}{10}}-1)}{2}+(x\%10+1)+9)\%11(xge 10))

    证明:
    排名分别在([1,11],[12,22][23,33]...)能扩展出来的数均为(55)(\%11=0)
    则只有零项((rk_frac{x}{10}-1)\%11)这几个扩展出来的数有贡献,为(frac{rk_{frac{x}{10}}(rk_{frac{x}{10}}-1)}{2})
    (rk_{frac{x}{10}})扩展的数(le x)的个数为(x\%10+1)
    再加上初始的无需扩展的数为(1sim 9),为(9)

    对于(s[i...j]),其右边能扩展的数,之与(rk_{s[i...j]}\%11)有关

    考虑(s_{i},s_{i+1})
    则我们重新定义(f_{i,d})为以i为左端点,若左边加上排名(\%11=d)后的极右端点

    [egin{aligned} &dp_{i,j}=dp_{i+1,(frac{j(j-1)}{2}+s_i+10)\%10}+1&s_i<j\ &dp_{i,j}=0,&s_ige j end{aligned}]

  • 相关阅读:
    解决android运行速度慢的问题
    nginx配合tomcat、resin等java应用服务器提供java支持(转)
    部分面向对象习题,留给学生做不错!!!
    该内存不能为“read”或“written”
    ORACLE数据库管理系统体系结构详解
    Linux下设置ORACLE自启动
    Oracle静默安装模板
    python安装步骤
    Oracle删除重复索引
    windows操作系统下python IDLE安装
  • 原文地址:https://www.cnblogs.com/Grice/p/12923001.html
Copyright © 2011-2022 走看看