POJ   3974

Description

Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "Can you propose an efficient algorithm to find the length of the largest palindrome in a string?"

A string is said to be a palindrome if it reads the same both forwards and backwards, for example "madam" is a palindrome while "acm" is not.

The students recognized that this is a classical problem but couldn't come up with a solution better than iterating over all substrings and checking whether they are palindrome or not, obviously this algorithm is not efficient at all, after a while Andy raised his hand and said "Okay, I've a better algorithm" and before he starts to explain his idea he stopped for a moment and then said "Well, I've an even better algorithm!".

If you think you know Andy's final solution then prove it! Given a string of at most 1000000 characters find and print the length of the largest palindrome inside this string.

Input

Your program will be tested on at most 30 test cases, each test case is given as a string of at most 1000000 lowercase characters on a line by itself. The input is terminated by a line that starts with the string "END" (quotes for clarity). 

Output

For each test case in the input print the test case number and the length of the largest palindrome. 

Sample Input

abcbabcbabcba
abacacbaaaab
END

Sample Output

Case 1: 13
Case 2: 6 题意:给一个字符串求这个串的最长回文子串的长度; 思路:用以下回文串的模板可以在线性时间内完成求最长的回文串的长度;
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int n,p[N];
char s[N],str[N]; void kp()
{
int i;
int mx=;
int id;
///for(i=n;str[i]!=0;i++)
///str[i]=0; ///没有这一句有问题,就过不了ural1297,比如数据:ababa aba;
for(i=;i<n;i++)
{
if(mx>i)
p[i]=min(p[*id-i],p[id]+id-i);
else
p[i]=;
for( ;str[i+p[i]]==str[i-p[i]];p[i]++);
if(p[i]+i>mx)
{
mx=p[i]+i;
id=i;
}
}
} void init()
{
str[]='$';
str[]='#';
for(int i=;i<n;i++)
{
str[i*+]=s[i];
str[i*+]='#';
}
n=n*+;
s[n]=;
} int main()
{
int Case=;
while(scanf("%s",s)!=EOF)
{
if(s[]=='E'&&s[]=='N'&&s[]=='D')
break;
n=strlen(s);
init();
kp();
int ans=;
for(int i=;i<n;i++)
if(p[i]>ans)
ans=p[i]; printf("Case %d: %d\n",Case++,ans-);
}
return ;
}

最新文章

  1. New Training Table
  2. 配置Eclipse编写HTML/JS/CSS/JSP页面的自动提示。
  3. MSSQL死锁产生原因及解决方法
  4. Android存储机制之Preference
  5. iPhone之Quartz 2D系列--图形上下文(2)(Graphics Contexts)
  6. visual leak dector内存泄漏检测方法
  7. 2013杭州网络赛C题HDU 4640(模拟)
  8. jQuery 自学笔记—9 常见特效 (终章)
  9. How to execute tons of tasks parallelly with TPL method?
  10. 《java.util.concurrent 包源码阅读》11 线程池系列之ThreadPoolExecutor 第一部分
  11. Linux iptables用法与NAT
  12. Hadoop_CDH安装
  13. Data truncation: Data too long for column &#39;content&#39; at row 1
  14. 第二次sprint
  15. 【转】.NET NPOI操作Excel常用函数
  16. BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)
  17. WPF 阴影效果
  18. bzoj 3997 Dilworth定理
  19. MySQL 删除重复记录
  20. python--lxml

热门文章

  1. Solr4:数据导入(dataimport)时,不符合Solr日期类型要求的字段的处理
  2. SAP的吐槽来源
  3. sql:pivot unpivot
  4. BeginInvoke与Invoke的区别
  5. 译:用InnoSetup模块化安装依赖项
  6. ios开发人员mac空间不够用的解决办法
  7. 解析Javascript中大括号&ldquo;{}&rdquo;的多义性
  8. [原]如何在Android用FFmpeg+SDL2.0解码声音
  9. net组件转化成COM组件
  10. Maven更新子模块的版本号