暑假训练第一周总结

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

一是循环字符串的最小表示法,这是一个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个,这两个之间连条边,容量为点的容量。

原文地址:https://www.cnblogs.com/137033036-wjl/p/5745903.html