【模板】Manacher

https://blog.csdn.net/qq_43456058/article/details/94588721
这玩意和扩展KMP很像,都是利用了 d p dp dp和贪心的思想(选择最远覆盖距离)。同时利用了状态的相似性。然后类似于“镜面”的对称点转换,做到了 O ( n ) O(n) O(n)的复杂度。

#include<bits/stdc++.h>
using namespace std;
const int N=1.1*1e7+5;
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
int len,Len[N*2];
char s[N],str[N*2];
void getstr() {
	int k=0;
	str[k++]='@';
	for(int i=0;i<len;i++) {
		str[k++]='#';
		str[k++]=s[i];
	}
	str[k++]='#';
	len=k;
}
int manacher() {
	int R=0,C;
	int maxx=0;
	for(int i=1;i<len;i++) {
		int i_mirror=2*C-i;
		if(R>i) Len[i]=min(R-i,Len[i_mirror]);
		else C=i,Len[i]=0;
		while(str[i+Len[i]+1]==str[i-Len[i]-1]) Len[i]++;
		if(i+Len[i]>R) {
			C=i;
			R=i+Len[i];
			maxx=max(maxx,Len[i]);
		}
	}
	return maxx;
}
signed main() {
    scanf("%s",s);
    len=strlen(s);
    getstr();
    printf("%d",manacher());
}
posted @ 2020-12-12 17:01  仰望星空的蚂蚁  阅读(12)  评论(0)    收藏  举报  来源