bzoj 2565: 最长双回文串 manacher

67人阅读 评论(0) 收藏 举报
分类:

题目链接


【想说的话】

没有..


【题解】

肯定是先跑一遍manacher

然后就想找到对于每个字符,它作为一个回文串的起点和终点时,回文串最长能为多少

这时候我们发现当一个字符作为终点时,最长的回文串的对称中心一定是最靠前越好

那么我们就像是跑manacher时,从前往后扫,维护一个最右端点,如果找到了右端点大于最右端点的,就暴力地把这一段都计算下

假设我们目前扫到的对称中心为i,i+r[i]大于maxr了,那么就从maxr+1扫到i+r[i],假设扫到的是j,那么以它为终点的回文串最长为j-i+1


找以一个字符为起点的最长回文串就反过来扫一遍就好了


【代码】

#include<bits/stdc++.h>

using namespace std;

char c[100010];
char s[200020];
int r[200020],Max[200020],ans1[200020],ans2[200020];
int n;

void manacher(){
	int mr=0,num,len=strlen(c);
	r[0]=1;
	for(int i=0; i<len; i++)s[n++]='#',s[n++]=c[i];
	s[n++]='#';
	for(int i=0; i<n; i++){
		if(mr>i)r[i]=min(r[2*num-i],mr-i+1);
		while(i-r[i]>=0 && i+r[i]<n && s[i+r[i]]==s[i-r[i]])r[i]++;
		if(r[i]+i-1>mr)mr=r[i]+i-1,num=i;
	}
}

int main(){
	scanf("%s",c);
	manacher();
	int last=0;
	for(int i=0; i<n; i++){
		if(i+r[i]-1>last){
			for(int j=last+1; j<i+r[i]; j++)if(s[j]!='#')ans1[j]=j-i+1;
			last=i+r[i]-1;
		}
	}
	last=n;
	for(int i=n-1; i>=0; i--){
		if(i-r[i]+1<last){
			for(int j=last-1; j>i-r[i]; j--)if(s[j]!='#')ans2[j]=i-j+1;
			last=i-r[i]+1;
		}
	}
	int ans=0;
	for(int i=1; i<n; i++)if(s[i]!='#')ans=max(ans,ans1[i]+ans2[i+2]);
	printf("%d\n",ans);
	
	return 0;
}


查看评论

【bzoj2565】最长双回文串 manacher

刚开始读错题了,以为整个串也要是回文串,后来发现是两个回文串拼起来就好了,那么就先插入‘#’,然后算出l[i]表示以i为结尾的最左的回文串的中心,这个随便算一下就好了,然后枚举每一个‘#’当做断点,然...
  • u012288458
  • u012288458
  • 2015-11-24 13:06:11
  • 955

BZOJ 2565 最长双回文串 Manacher

题目大意: 定义双回文串G是指一个可以被拆分成两个部分(S和T)的字符串G = S + T, 且S和T都是回文串的串, G自己本身可以不是回文串 给出一个长度为n ( 2 大致思路: ...
  • u013738743
  • u013738743
  • 2015-03-20 22:03:48
  • 1546

BZOJ2565【回文自动机】

跑两遍PAM.分别找到每个点做为结尾字符和开始字符的最长回文串的长度. /* I will wait for you */ #include #include #include #include ...
  • Lethelody
  • Lethelody
  • 2015-04-12 10:39:58
  • 1460

BZOJ2565 最长双回文串(回文树)

HYSBZ - 2565 最长双回文串 Time Limit: 10000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu...
  • u013268685
  • u013268685
  • 2015-09-12 15:19:27
  • 608

bzoj2565: 最长双回文串

回文串。。。Manachar! 将Manachar的p数组转换为l[i](i为右端点往左最长的回文串),r[i](同理),然后O(n)搜一遍求最值即可。 p.s.Manachar的核心是枚举中...
  • Miao_zc
  • Miao_zc
  • 2016-03-11 20:55:42
  • 329

【BZOJ2565】最长双回文串 Manacher

Manacher拓展、
  • Vmurder
  • Vmurder
  • 2014-12-28 16:01:50
  • 955

BZOJ 2565 最长双回文串(manacher)

题意:求一个最长的双回文串,双回文串定义是两个回文串是连续的但是不相交。 做法:manacher预处理一下。然后用h1[i]代表以i为结尾的最长回文串,h2[i]代表以i为起点的最长回文串。我这里用...
  • u012962816
  • u012962816
  • 2015-05-20 14:55:08
  • 377

bzoj 2565 最长双回文串 manacher

Description顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。 输入长度为n的串S,求S的最长双回文子串T...
  • cdsszjj
  • cdsszjj
  • 2017-07-27 09:56:50
  • 105

BZOJ 2565 最长双回文串 (Manacher)

2565: 最长双回文串Time Limit: 10 Sec Memory Limit: 128 MB Description顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而ab...
  • w4149
  • w4149
  • 2017-07-28 10:06:30
  • 131

bzoj 2565: 最长双回文串(manacher)

2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1605  Solved: 823 [Submit][Status][Dis...
  • clover_hxy
  • clover_hxy
  • 2016-12-02 09:33:40
  • 212
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 1825
    排名: 2万+
    最新评论