POJ3974:Palindrome——题解

http://poj.org/problem?id=3974

题目大意:

求最大回文子串长度。

————————————————————

马拉车板子题。

马拉车讲解先割。

(测试过如果写成函数的话会很慢(2000+ms),这么写是(200+ms),所以不美观就不美观吧)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000010
using namespace std;
int l,cnt,mx,id,p[2*N],maxn;
char s[2*N];
int main(){
    while(233){
    cnt++;
    scanf("%s",s+1);
    if(s[1]==‘E‘&&s[2]==‘N‘&&s[3]==‘D‘)break;

    l=strlen(s+1);
    s[0]=‘@‘;
    for(int i=l;i>=1;i--)s[i*2]=s[i];
    for(int i=1;i<=2*l+1;i+=2)s[i]=‘#‘;
    s[2*l+2]=‘?‘;
    l=2*l+1;

    maxn=mx=0;
    for(int i=1;i<=l;i++){
        if(mx>i)p[i]=min(p[2*id-i],mx-i);
        else p[i]=1;
        while(s[i-p[i]]==s[i+p[i]])p[i]++;
        if(i+p[i]>mx){
        mx=i+p[i];
        id=i;
        }
        maxn=max(maxn,p[i]);
    }

    printf("Case %d: %d\n",cnt,maxn-1);
    }
    return 0;
}
时间: 2024-10-10 00:41:19

POJ3974:Palindrome——题解的相关文章

POJ 1159 Palindrome 题解

本题的题意理解之后,就是求最长回文子序列 longest palindrome subsequence,这里注意子序列和子串的区别. 有两种求法,一种是直接求,相当于填矩阵右上对角阵,另一种是转化为longest common subsequence的求法. 最大难点就是要求内存不能使用二维的. 故此第一种方法是有点难度的,因为需要把二维矩阵的对角线转化为一维表记录,对好下标就好了. 第二中方法会稍微容易点,效率都是一样的O(n*n). 方法1: #include <cstdio> const

POJ3974 Palindrome

Time Limit: 15000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu 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 efficien

POJ----(3974 )Palindrome [最长回文串]

Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 5121   Accepted: 1834 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 eff

poj3974 Palindrome【回文】【Hash】

Palindrome Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 13157   Accepted: 5028 Description Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "Can you pr

[poj]3280 Cheapest Palindrome 题解

[poj]3280 Cheapest Palindrome 区间dp 题意: 给你长度为m的字符串,其中有n种字符,每种字符都有两个值,分别是插入这个字符的代价,删除这个字符的代价,让你求将原先给出的那串字符变成一个回文串的最小代价. M<=2000 设 dp[i][j] 为区间 i~j 的回文串的最小代价 现在考虑怎样从别的状态转移到 区间i~j 三种情况 首先 str[i]==str[j] 那么 dp[i][j] = dp[i+1][j-1] 其次 (i+1)~j 是一个回文串 dp[i][

【Manacher算法】poj3974 Palindrome

Manacher算法教程:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 模板题,Code 附带注释: 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 char b[10000001],a[10000001]; 6 char tmp[10000001]; 7 int n,f[100

[poj3974] Palindrome 解题报告 (hash\manacher)

题目链接:http://poj.org/problem?id=3974 题目: 多组询问,每组给出一个字符串,求该字符串最长回文串的长度 数据范围支持$O(nlog n)$ 解法一: 二分+hash 回文串分奇数串和偶数串.对于奇数串,我们枚举它的中点,二分一下这个中点可以向两边扩展多远的距离:对于偶数串,我们枚举它中间两个点靠左的点,同样二分可以扩展的距离,这样时间复杂度就是$O(nlog n)$的了 说起来容易,写起来不是很容易 解法二: 每次跑一遍manacher就好了 说起来容易,写起来

POJ--3974 Palindrome(回文串,hash)

链接:点击这里 #include<iostream> #include<algorithm> #include<stdio.h> #include<cstring> using namespace std; #define maxn 1000005 #define LL long long #define ull unsigned long long const LL P = 131; ull p[maxn+10],f[maxn],ff[maxn]; int

Valid Palindrome leetcode java

题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example, "A man, a plan, a canal: Panama" is a palindrome. "race a car" is not a palindrome. Note: Have you consider