zoukankan      html  css  js  c++  java
  • 2019.8.9刷题统计

    第一题(未通过):1128

    这道题字符串的长度为1000000000,所以时间复杂度应该在log(n)级别,但我写出来了一个比O(l)还要大的复杂度,自然没通过。

    但是这道题我也想不出复杂度更低的算法了。。。

    第二题:1129

    这道题最朴素的算法就是每轮都计算前i位和后i位的hash值,时间复杂度为O(n2*数据数量)。针对这道题的数据,是1011以上级别的复杂度。

    可以加一个优化:由于主串不变,所以每轮只需要计算第i位的hash值,时间复杂度O(n*数据数量),低于107

    另外一个问题是:如何求后缀的hash值?

    先推导:设f[i]为长度为i的后缀的hash值,st为字符串,l为st的长度则

    f[1]=st[l-1]

    f[2]=st[l-1]+st[l-2]P

    f[3]=st[l-1]+st[l-2]P+st[l-3]P2

    f[4]=st[l-1]+st[l-2]P+st[l-3]P2+st[l-4]P3

    ……

    可以看出,每个f[i]的内容都等于f[i-1]的内容加上st[l-i]Pi-1。而Pi-1则可以在第i次循环中计算(即每个循环中P的值*=进制,i=1时除外)。

    思路清楚以后,这道题就很简单了。

    AC代码:

  • 相关阅读:
    java线程池
    缓存命中
    dubbo面向服务使用
    ActiveMQ
    创建证书
    struts2的运行原理以及底层的工作机制
    jdbc,mybatis,hibernate各自优缺点及区别
    struts2与springmvc的区别
    linux vi 命令编辑操作
    Linux FTP基本操作命令 ( 序列二 ftp)
  • 原文地址:https://www.cnblogs.com/wangximing/p/11327841.html
Copyright © 2011-2022 走看看