Themenbeschreibung
Gegeben sei eine Zeichenfolge S, die nur aus englischen Kleinbuchstaben a,b,c,...y,z besteht. Ermitteln Sie die Länge des längsten Palindroms in S.
Die Stringlänge beträgt n.
Eingabeformat
Eine Zeichenfolge SS, die aus einer Zeile englischer Kleinbuchstaben a, b, c, ⋯, y, z besteht.
Ausgabeformat
Eine Ganzzahl, die die Antwort darstellt.
Eingabe- und Ausgabebeispiele
Geben Sie zum Kopieren #1 ein
aaa
Ausgabe Nr. 1 Kopie
3
Anleitungen/Tipps
1≤n≤1,1×107
Ideen:
Brute-Force-Suche nach palindromischen Zeichenfolgen:
Verteilen Sie ein Zeichen als Mittelpunkt auf beide Seiten.
Der Manacher-Algorithmus ist eine Optimierung für Palindrom-Strings:
Als Erstes ist die Größe der Zeichenfolge zu berücksichtigen, die gerade oder ungerade sein kann.
Wir können sie alle in ungerade Zahlen subtrahieren, indem wir einfach Zeichen hinzufügen.
Achten Sie auf den Anfang und das Ende, eines davon ist die Rolle des Wachpostens.
Das P-Array stellt die Länge der kleinen Palindrom-Zeichenfolge dar, deren Radius die Mitte ist.
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
const int N = 11000002;
int n, P[N << 1];
char a[N], S[N << 1];
void change() {
n = strlen(a);
int k = 0;
S[k++] = '$';
S[k++] = '#';
for (int i = 0; i < n; i++) {
S[k++] = a[i];
S[k++] = '#';
}
S[k++] = '&';
n = k;
}
void manacher() {
int R = 0, C;
for (int i = 1; i < n; i++) {
if (i < R) P[i] = min(P[(C << 1)-i] , P[C] + C - i);
else P[i] = 1;
while (S[i + P[i]] == S[i - P[i]]) P[i]++;
if (P[i] + i > R) {
R = P[i] + i;
C = i;
}
}
}
int main() {
scanf("%s", a);
change();
manacher();
int ans = 1;
for (int i = 0; i < n; i++) ans = max(ans, P[i]);
cout << ans - 1;
return 0;
}