浅谈Manacher算法与扩展KMP之间的联系

const int BASE = 131, N = 1e+6 + 7;typedef unsigned long long ULL;//rec: record forward direction hash value//rRec:record backward direction hash value//P: record power of BASEULL rec[N], rRec[N], P[N];int Bin(int len, int end, int rEnd, int __len){int l = 1, r = len;while (l <= r){int mid = l + (r – l) / 2;ULL lHash = rec[end] – (end – mid >= 0 ? rec[end – mid] : 0) * P[mid];ULL rHash = rRec[rEnd] – (rEnd + mid < __len ? rRec[rEnd + mid] : 0) * P[mid];if (lHash ^ rHash)r = mid – 1;elsel = mid + 1;}return r;}int solution(char *S){const int len = strlen(S);P[0] = 1ULL;//calculate power of BASEfor (int i = 1; i < =len; ++i)P[i] = P[i – 1] * 131;rec[0] = S[0], rRec[len – 1] = S[len – 1];//calculate the string <span style="font-family:Microsoft YaHei;">hash </span>valuefor (int i = 1, j = len – 2; i < len; ++i, –j)rec[i] = rec[i – 1] * BASE + S[i], rRec[j] = rRec[j + 1] * BASE + S[j];int ans = 0;for (int i = 0; i < len; ++i){int tmp;//for the even casetmp = Bin(min(i + 1, len – i – 1), i, i + 1, len);ans = max(ans, tmp << 1);//for the odd casetmp = Bin(min(i, len – i – 1), i – 1, i + 1, len);ans = max(ans, tmp << 1 | 1);}return ans;} 上述代码有两个地方需要说明一下:1.无符号长整型溢出时,编译器会自动取模 2.关于计算P数组,,如果是单case,P数组的求解可以放到solution函数中,如果是多case,P数组的求解必须放到外面,因为P数组只用计算一次就可以了.此种解法,能跑过POJ 3974和hdu 3068,感兴趣的朋友可以试试这种解法.

每天告诉自己一次,『我真的很不错』

浅谈Manacher算法与扩展KMP之间的联系

相关文章:

你感兴趣的文章:

标签云: