vector<int> d1(n);
void Manache1(string s ){//奇数回文串存入d1 字符串下标自0到n-1
for (int i = 0, l = 0, r = -1; i < n; i++) {
int k = (i > r) ? 1 : min(d1[l + r - i], r - i + 1);//对称的获取的d1[l + r - i],同时注意对超过 r 区域的未知区域进行截断
while (0 <= i - k && i + k < n && s[i - k] == s[i + k]) {//朴素算法拓展
k++;
}
d1[i] = k--;
if (i + k > r) {//实时更新l r 维护 r尽量大
l = i - k;
r = i + k;
}
}
}
//例如 s = a b a b a b c
//d1[] = 3------(代表 b a b a b)
vector<int> d2(n);
void Manache1(string s ){//偶数回文串存入d2 字符串下标自0到n-1
for (int i = 0, l = 0, r = -1; i < n; i++){
int k = (i > r) ? 0 : min(d2[l + r - i + 1], r - i + 1);
while (0 <= i - k - 1 && i + k < n && s[i - k - 1] == s[i + k]) {
k++;
}
d2[i] = k--;
if (i + k > r) {
l = i - k - 1;
r = i + k;
}
}
}
//例如 s = c b a a b d
//d2[] = 2------(代表 b a a b)
Manacher 算法
最新推荐文章于 2024-10-01 23:05:47 发布