poj 3974 Palindrome
来源:互联网 发布:淘宝货款 编辑:程序博客网 时间:2024/04/26 02:03
题目链接:http://poj.org/problem?id=3974
题目思路:求最长回文子串。这个题目数据太水了,网上我找到了两个错误方法,个人觉得这个题不适合用后缀数组,后缀数组里面要用到RMQ,而这样会超内存。网上看到了一种O(n)的算法,叫做Manacher,比较好理解,而且编程也简单,就学习了一下。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<string>#include<queue>#include<algorithm>#include<vector>#include<stack>#include<list>#include<iostream>#include<map>using namespace std;#define inf 0x3f3f3f3f#define M 1100000int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}char s[2*M],str[M];int p[2*M];int main(){ int i,j,k,n,mx,id,count=1; while(scanf("%s",str)!=EOF) { if(str[0]=='E') break; n=strlen(str); s[0]='$'; for(i=0;str[i];i++) { s[2*i+1]='#'; s[2*i+2]=str[i]; } s[2*n+1]='#'; s[2*n+2]=0; mx=0; id=0; for(i=1;i<=2*n+1;i++) { if(i<=mx) p[i]=min(p[2*id-i],mx-i+1); else p[i]=1; for(;s[i+p[i]]==s[i-p[i]];p[i]++) ; if(i+p[i]-1>mx) { mx=i+p[i]-1; id=i; } } int ans=0; for(i=1;i<=2*n+1;i++) { ans=max(ans,p[i]-1); } printf("Case %d: %d\n",count++,ans); }}
- poj 3974 Palindrome
- poj 3974 Palindrome
- poj 3974 Palindrome
- poj 3974 Palindrome
- 【Manacher】 POJ 3974 Palindrome
- POJ 3974 Palindrome
- POJ 3974 Palindrome Manacher
- POJ 3974 Palindrome【Manacher】
- 【POJ 3974】 Palindrome
- POJ 3974 Palindrome
- poj 3974 Palindrome(manacher)
- POJ 3974 - Palindrome(manacher)
- POJ - 3974 Palindrome(manacher)
- POJ 3974 Palindrome
- POJ 3974 Palindrome
- POJ 3974 Palindrome manacher
- POJ 3974 Palindrome
- POJ 3974 Palindrome Manacher
- JNI学习笔记(二)JNI中的java语言与本地C/C++语言之间的映射(附例子)
- 正则表达式学习(三)正则表达式各种操作符的运算优先级
- 仿android系统主界面 下方的小按钮滑动
- 读书笔记整理二:11g存储增强
- Oracle AWR(Automatic Workload Repository) 说明 --转自tianlesoftware
- poj 3974 Palindrome
- [java]java中的访问权限
- 手机帝国诺基亚堕落史
- ActiveSync合作关系对话框的配置
- 结构体初始化
- [java]final关键字
- hdu1573 X问题 中国剩余定理
- WdatePicker 用法
- 游戏引擎发展漫谈(11-19) 好长啊。。。。 .