首页 > 编程语言 > 详细

最长回文字串(马拉车算法)

时间:2020-07-21 22:16:34      阅读:70      评论:0      收藏:0      [点我收藏+]

https://blog.csdn.net/qq_16554583/article/details/79763296

模板题:

Time Limit:1000ms
Case Time Limit:1000ms
Memory Limit:256MB

描述

   小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。

   这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?”

   小Ho奇怪的问道:“什么叫做最长回文子串呢?”

   小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦~”

   小Ho道:“原来如此!那么我该怎么得到这些字符串呢?我又应该怎么告诉你我所计算出的最长回文子串呢?

   小Hi笑着说道:“这个很容易啦,你只需要写一个程序,先从标准输入读取一个整数N(N<=30),代表我给你的字符串的个数,然后接下来的就是我要给你的那N个字符串(字符串长度<=10^6)啦。而你要告诉我你的答案的话,只要将你计算出的最长回文子串的长度按照我给你的顺序依次输出到标准输出就可以了!你看这就是一个例子。”

提示一 提示二 提示三 提示四
Sample Input
3
abababa
aaaabaa
acacdas
Sample Output
7
5
3
 
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define Min(a,b) a>b?b:a  
#define Max(a,b) a>b?a:b
using namespace std;
typedef long long ll;
int read() {
    int x=0; int f=1;
    char ch=getchar();
    while(ch<0||ch>9) {if(ch==-) f=-1; ch=getchar();}
    while(ch>=0&&ch<=9) {x=x*10+ch-0; ch=getchar();}
    return x*f;
}
const int maxn=3e6+100;
const int mod=1e9+7;
int len[maxn];
char str[maxn];
char ss[maxn];
int n,mx,id,len1;
void inint(){
    int k=0;
    str[k++]=$;
    for(int i=0;i<len1;i++){
        str[k++]=#;
        str[k++]=ss[i];
    }
    str[k++]=#;
    len1=k;
}
int Manacher(){
    len[0]=0;
    int sum=0;
    mx=0;
    for(int i=1;i<len1;i++){
        if(i<mx) len[i]=min(mx-i,len[2*id-i]);
        else len[i]=1;
        while(str[i-len[i]]==str[i+len[i]]) len[i]++;
        if(len[i]+i>mx){
            mx=len[i]+i;
            id=i;
            sum=max(sum,len[i]);
        }
    }
    return (sum-1);
} 
int main(){
    scanf("%d",&n);
    while(n--){
        memset(str,0,sizeof(str));
        scanf("%s",ss);
        len1= strlen(ss);
        inint();
        int t=Manacher();
        printf("%d\n",t); 
    }
} 

 

 

最长回文字串(马拉车算法)

原文:https://www.cnblogs.com/lipu123/p/13356858.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!