一. KMP
1 找字符串x是否存在于y串中,或者存在了几次
2.求多个字符串的最长公共子串
3.next数组的应用
1) 求循环节
2) 利用next数组的回退来求值:
4.即是前缀又是后缀
POJ2752 Seek the Name, Seek the Fame
HDU2594 Simpsons’ Hidden Talents
二.扩展KMP
1)求前缀、后缀是否为回文串
三.Manacher算法
1)单纯的求最长回文串长度
2)求出最长回文串的位置
四.最小最大表示法:
模板:
int getmin(char *s, int len, int type) //当type为1时,为最小表示法;当type为-1时,为最大表示法 { int i = 0, j = 1, k = 0; while(i<len && j<len && k<len) { int t = s[(i+k)%len]-s[(j+k)%len]; if (!t) k++; else { //当t>0时,i~i+k的位置都不可能作为起始点,因为在j~j+k处有更优值。同理j。 if (type*t>0) i += k+1; //唯一不同的地方 else j += k+1; if (i==j) j++; k = 0; } } return i<j?i:j; /* 为什么要返回下标小的呢? 看循环条件,可知:当i、j、k其中一个等于len时,循环结束。 1) 当k==len时,表明在i处的表示等于在j处的表示。那么随便哪一个都行 2) 当k!=len时,即i或j其中一个等于len,那么等于len的那个下标其实已经溢出了。所以取小的那个 综上:return min(i, j); */ }