hdu 4513 最长回文子串

就是在最基础的回文子串中多加个判断条件就行

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int num1[100010],num2[200010];
int min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int T,n,i,j;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        j=1;
        num2[0]=-1;
        num2[1]=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num1[i]);
            num2[++j]=num1[i];
            num2[++j]=1;
        }
        int mark[200010];
        memset(mark,0,sizeof(mark));
        int right=0,k=0,id;
        for(i=0;i<j;i++)
        {
            if(right<=i) mark[i]=1;
            else
            mark[i]=min(mark[2*id-i],right-i);
            while(num2[i+mark[i]]==num2[i-mark[i]])
            {
                if(num2[i+mark[i]]==1) mark[i]++;
                else if(num2[i+mark[i]]<=num2[i+mark[i]-2]&&num2[i-mark[i]]<=num2[i-mark[i]+2]) mark[i]++;
                else break;
            }
            if(mark[i]+i>right)
            {
                right=mark[i]+i;
                id=i;
            }
            if(mark[i]>k) k=mark[i];
        }
        printf("%d\n",k-1);
    }
    return 0;
}
时间: 2024-07-30 11:05:22

hdu 4513 最长回文子串的相关文章

hdu 5340 最长回文子串变形

http://acm.hdu.edu.cn/showproblem.php?pid=5340 Problem Description Can we divided a given string S into three nonempty palindromes? Input First line contains a single integer T≤20 which denotes the number of test cases. For each test case , there is

hdu 3068 最长回文子串 TLE

后缀数组+RMQ是O(nlogn)的,会TLE..... 标准解法好像是马拉车,O(n).... 1 #include "algorithm" 2 #include "cstdio" 3 #include "cstring" 4 using namespace std; 5 #define maxn 220020 6 7 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; 8 int rank[maxn],heigh

hdu 3068 最长回文子串 马拉车模板

前几天用后缀数组写过一次这题,毫无疑问很感人的TLE了-_-|| 今天偶然发现了马拉车模板,O(N)时间就搞定 reference:http://acm.uestc.edu.cn/bbs/read.php?tid=3258 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 #define N 110010 6 char s[N*2],str[N*

HDU 3068 [最长回文子串]

#include<iostream> #include<string> #include<string.h> #include<algorithm> #define MAX_LEN 310000 using namespace std; int p[MAX_LEN]; int findBMstr(string &str){ int maxx=-1; memset(p,0,sizeof(p)); int mx=0,id=0; for(int i=1;i

hdu 3068 最长回文(manacher&amp;最长回文子串)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7317    Accepted Submission(s): 2500 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU 3068 最长回文 (manacher算法)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9188    Accepted Submission(s): 3159 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

[hdu3068 最长回文]Manacher算法,O(N)求最长回文子串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:求一个字符串的最长回文子串 思路: 枚举子串的两个端点,根据回文串的定义来判断其是否是回文串并更新答案,复杂度O(N3). 枚举回文串的对称轴i,以及回文半径r,由i和r可确定一个子串,然后暴力判断即可.复杂度O(N2). 在上一步的基础上,改进判断子串是否是回文串的算法.记fi(r)=(bool)以i为对称轴半径为r的子串是回文串,fi(r)的值域为{0, 1},显然fi(r)是关于r

HDU 3068(最长回文-manacher)[Template:manacher]

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9660    Accepted Submission(s): 3353 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

【最长回文子串】HDU3068最长回文【Manacher算法】

一张图领悟Manacher算法,计算字符串最长回文子串 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理)