首页 > 学院 > 开发设计 > 正文

hihocoder1032:(manacher)

2019-11-08 03:05:40
字体:
来源:转载
供稿:网友

题目:http://hihocoder.com/PRoblemset/problem/1032

题目分析:manacher模板,RE了好多次。一开始是数组忘了开两倍长度,接下来又是多算了最后一位的答案导致数组越界(即’$’),重点是忘了写“if( i+temp[i]>p+temp[p] ) p=i;”这句如此重要的话……输出答案的时候要注意分类讨论一下。

CODE:

#include<iostream>#include<string>#include<cstring>#include<cmath>#include<cstdio>#include<cstdlib>#include<stdio.h>#include<algorithm>using namespace std;const int maxn=1000100;int temp[maxn<<1];string t,s;int n;int main(){	freopen("c.in","r",stdin);	freopen("c.out","w",stdout);		scanf("%d",&n);	for (int q=1; q<=n; q++)	{		cin>>t;		int tlen=t.size()-1;				s="";		s+='@';		for (int i=0; i<tlen; i++)		{			s+=t[i];			s+='#';		}		s+=t[tlen];		s+='$';				int slen=s.size();		int p=1,ans=0;		temp[0]=temp[1]=0;		for (int i=2; i<slen; i++)		{			temp[i]=max( 0,min( temp[2*p-i],p+temp[p]-i ) );			while ( s[i+temp[i]]==s[i-temp[i]-2] ) temp[i]++;			if ( i+temp[i]>p+temp[p] ) p=i;			if (s[i-1]=='#') ans=max(ans, temp[i]+(temp[i])%2 );			else ans=max(ans, temp[i]+(temp[i]-1)%2 );		}				printf("%d/n",ans);	}		return 0;}
上一篇:文章标题

下一篇:c语言之单链表

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表