zoukankan      html  css  js  c++  java
  • 暑假训练第一周总结

    这一周学习到的新算法有两个。

    一是循环字符串的最小表示法,这是一个O(n)的算法。主要采用指针滑动的方式。首先定义i和j两个指针,i初始为0,j初始为1, k = 0开始,检验s[i+k] 与 s[j+k] 对应的字符是否相等,如果相等则k++,一直下去,直到找到第一个不同,(若k试了一个字符串的长度也没找到不同,则那个位置就是最小表示位置,算法终止并返回)。则该过程中,s[i+k] 与 s[j+k]的大小关系,有三种情况: 

    (1)s[i+k] > s[j+k],则i滑动到i+k+1处 --- 即s1[i->i+k]不会是该循环字符串的“最小表示”的前缀。

    (2)s[i+k] < s[j+k],则j滑动到j+k+1处,原因同上。

    (2)s[i+k] = s[j+k],则 k++; if (k == len) 返回结果。 

     如果 k == len, 则返回i与j中的最小值, 如果 i >= len   则返回j,如果 j >= len   则返回i。

    二是manacher算法。

    假设原串为a[]={aaa},使用manacher算法将原串变为#a#a#a#,对应的p数组为{1,2,3,4,3,2,1}.p[i]/2-1的值为新串中以i为中心的回文半径.(回文串长度为奇数,即a[i]!=’#’);p[i]/2的值为新串中以i为中心的回文半径(回文串长度为偶数,即a[i]==’#’&&p[i]!=1)

    除了学习这两个新算法的情况。主要复习了AC自动机,二分图和最大流。其中AC自动机较难掌握的是将起状态转化变为矩阵。方式大概为献给每个状态编码,然后能转移的状态链接一条边。这样化为矩阵。二分图难得则是建图。对于矩阵上的问题如果用二分图求解一般是将横坐标和纵坐标作为二个集合。其他的情况就很多元化。其中二分图的最小点覆盖问题指的是用最少的点使得每条边至少一个端点被挑选。独立集则是多个点之间没有可达性。最大流中,如果点有容量限制,将点扩成2个,这两个之间连条边,容量为点的容量。

  • 相关阅读:
    js经典试题之数据类型
    js单行写一个评级组件
    Spring Cloud Gateway的全局异常处理
    spring cloud gateway 全局过滤器
    公司ES升级带来的坑怎么填?
    Sentinel: 分布式系统的流量防卫兵
    微信小程序之页面打开数量限制
    微信小程序登录那些事
    API数据加密框架monkey-api-encrypt
    微信小程序之启动页的重要性
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/5745903.html
Copyright © 2011-2022 走看看