P3805 [Vorlage] Manacher-Algorithmus

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;

}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/128735247
Recomendado
Clasificación