终于,我AC了马拉车算法555
#include <bits/stdc++.h>
using namespace std;
const int N = 2e7 + 10;
char s[N], t[N];
int p[N];
int manacher(string s, int len) {
int l = 0;
t[l++] = '$', t[l++] = '#';
for (int i = 0; i < len; i++) t[l++] = s[i], t[l++] = '#';
t[l] = 0;
int r = 0, c = 0;
for (int i = 0; i < l; i++) {
int &P = p[i];
P = r > i ? min(p[2 * c - i], r - i) : 1;
while (t[i + P] == t[i - P]) P++;
if (i + P > r) r = i + P, c = i;
}
int ans = 0;
for (int i = 0; i < l; i++) ans = max(ans, p[i]);
return ans - 1;
}
int main() {
cin >> s;
cout <<manacher(s, strlen(s));
return 0;
}
上面是ac代码
但是我想请教一下。。。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e7 + 10;
string s, t;
int p[N];
int manacher(string s, int len) {
int l = 0;
t[l++] = '$', t[l++] = '#';
for (int i = 0; i < len; i++) t[l++] = s[i], t[l++] = '#';
t[l] = 0;
int r = 0, c = 0;
for (int i = 0; i < l; i++) {
int &P = p[i];
P = r > i ? min(p[2 * c - i], r - i) : 1;
while (t[i + P] == t[i - P]) P++;
if (i + P > r) r = i + P, c = i;
}
int ans = 0;
for (int i = 0; i < l; i++) ans = max(ans, p[i]);
return ans - 1;
}
int main() {
cin >> s;
cout <<manacher(s, s.size());
return 0;
}
下面的代码仅仅是改了一下,把$char$数组改成了$string$,为什么就会指针错误了捏?
%%%
$string$最多$65536$个字符,$2e7$超了,所以会$RE$
OK
Thanks大佬
%%%