zoukankan      html  css  js  c++  java
  • 基础

    hash好像可以暴力水过很多字符串算法

    1、kmp

    问题:给两个字符串S1,S2,求S2是否是S1的子串,并求S2在S1中出现的次数

    把S2 Hash出来,在S1里找所有长度为|S2|

    2、AC自动机

    问题:给N个单词串,和一个文章串,求每个单词串是否是文章串的子串,并求每个单词在文章中出现的次数。

    把每一个单词hash成整数,再把文章的每一个子串hash成整数,接下来只需要进行整数上的查找即可。

    复杂度:O(|A|2+|S|)

    用AC自动机可以做到O(|A|+|S|)

    3、后缀数组

    问题:给两个字符串S1,S2,求它们的最长公共子串的长度。

    将S1的每一个子串都hash成一个整数,将S2的每一个子串都hash成一个整数

    两堆整数,相同的配对,并且找到所表示的字符串长度最大的即可。

    复杂度:O(|S1|2+|S2|2)

    用后缀数组可以优化到O(|S|log|S|)

    4、马拉车

    问题:给一个字符串S,求S的最长回文子串。

    先求子串长度位奇数的,再求偶数的。枚举回文子串的中心位置,然后二分子串的长度,直到找到一个该位置的最长回文子串,不断维护长度最大值即可。

    复杂度:O(|S|log|S|)

    用manacher可以做到O(|S|)

    5、扩展kmp

    问题:给一个字符串S,求S的每个后缀与S的最长公共前缀

    枚举每一个后缀的起始位置,二分长度,求出每个后缀与S的最长公共前缀。

    复杂度:O(|S|log|S|)

    用extend-kmp可以做到O(|S|)

    后记

    hash真是一种优雅的暴力。

    因为字符串特殊的性质,我们可以二分得处理它,一般都有单调性。

  • 相关阅读:
    比较两个日期的大小(年月日)
    js闭包
    星星点点
    刮刮卡刮奖效果
    html图片自适应屏幕大小(手机)
    将博客搬至CSDN
    类的讲义
    Anaconda教程
    css基础
    javascript
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12401283.html
Copyright © 2011-2022 走看看