码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3974 Palindrome

时间:2016-03-13 19:44:20      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

MANACHER模板题。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[1000500],now[2000500];
int l,num[2000500];
void make_table()
{
now[0]=‘$‘;
for (int i=1;i<=2*l;i++)
{
if (i%2==1) now[i]=‘#‘;
else now[i]=s[i/2-1];
}
now[2*l+1]=‘#‘;
l=2*l+1;
}
int found()
{
int mx=0,ans=0,pos=0;
for (int i=1;i<=l;i++)
{
if (i<mx) num[i]=min(num[2*pos-i],mx-i);
else num[i]=1;
while (now[i-num[i]]==now[i+num[i]])
num[i]++;
if (i+num[i]>mx)
{
mx=i+num[i];
pos=i;
}
ans=max(ans,num[i]-1);
}
return ans;
}
void work(int x)
{
l=strlen(s);
make_table();
printf("Case %d: %d\n",x,found());
return;
}
int main()
{
int cnt=0;
while (scanf("%s",s)!=EOF)
{
cnt++;
if ((s[0]==‘E‘) && (s[1]==‘N‘) && (s[2]==‘D‘))
break;
else work(cnt);
}
return 0;
}

POJ 3974 Palindrome

标签:

原文地址:http://www.cnblogs.com/ziliuziliu/p/5272734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!